从一个数组的每个值中填充2D数组

3
我是一名有用的助手,可以为您翻译文本。
我有一个二维数组,希望生成格式化的数组。实际上,我想通过重新构造输入数组来一次生成多行。
我的二维数组:
$occupied_ids = [
    [8457, 6584],
    [9874, 4586],
];

预期输出:
array (
  0 => 
  array (
    'occupied_id' => 8457,
    'feed' => 2,
    'status' => 1,
    'status_date' => '2022-09-13',
  ),
  1 => 
  array (
    'occupied_id' => 6584,
    'feed' => 2,
    'status' => 1,
    'status_date' => '2022-09-13',
  ),
  2 => 
  array (
    'occupied_id' => 9874,
    'feed' => 2,
    'status' => 1,
    'status_date' => '2022-09-13',
  ),
  3 => 
  array (
    'occupied_id' => 4586,
    'feed' => 2,
    'status' => 1,
    'status_date' => '2022-09-13',
  ),
)

我的工作代码:
foreach($occupied_ids as $ele){
    $attributes = array_map(function($v){
        $feed = isset($_GET['feed']) ? $_GET['feed'] : 2;
        $status = 1;
        return [
            'occupied_id'   =>  $v,
            'feed'          =>  $feed,
            'status'        =>  $status,
            'status_date'   =>  date('Y-m-d'),
       ];
    }, $ele);

    /*Call function to multi-insert*/
    //multi_insert($attributes);
}

但我正在寻找一种不带外循环的方法。

1
你为什么不想循环? - gen_Eric
1
因为我的数组大小非常长。 - Deev Junior
5
那不是更加强有力的循环的理由吗? - Jon Tan
3个回答

1

我不确定这是否更好,但我试着改进了一下。我要去吃午饭了,稍后再回来看看能否进行优化:

$occupied_ids = call_user_func_array('array_merge', $occupied_ids);

$temp = [   'feed'          =>  isset($_GET['feed']) ? $_GET['feed'] : 2,
            'status'        =>  1,
            'status_date'   =>  date('Y-m-d'),
       ];

$attributes = array_map(function($v) use($temp) {
                            $r = $temp;
                            $r['occupied_id'] = $v;
                            return $r;
                        },
                        $occupied_ids);

1
使用array_reduce函数来将数组的第一层展平。
$occupied_ids = [
    [8457, 6584],
    [9874, 4586],
];

function format_elem($v)
{
        $feed = isset($_GET['feed']) ? $_GET['feed'] : 2;
        return [
            'occupied_id'   =>  $v,
            'feed'          =>  $feed,
            'status'        =>  1,
            'status_date'   =>  date('Y-m-d'),
       ];
}
$ids=array_reduce($occupied_ids,'array_merge',[]);
$attributes =array_map(format_elem,$ids);

0
通过预先展开数据(通过在array_merge()调用中展开行),您可以调用array_map()而不是array_reduce(),因为现在输入将具有与所需输出相同的行数。
代码:(演示
var_export(
    array_map(
        fn($v) => [
            'occupied_id'   =>  $v,
            'feed'          =>  $_GET['feed'] ?? 2,
            'status'        =>  1,
            'status_date'   =>  date('Y-m-d'),
        ],
        array_merge(...$occupied_ids)
    )
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接