如何通过唯一ID组合对象的php数组?

问题描述 投票:5回答:2

我有这两个数组。

第一个数组来自用户输入$cart

$cart = [
   ['id' => 3, 'weight' => 20, 'percentage' => 80],
   ['id' => 1, 'weight' => 50, 'percentage' => 80],
   ['id' => 2, 'weight' => 40, 'percentage' => 80],
];

和第二个数组,我做一个数据库SELECT id, stock WHERE id IN (3,1,2),结果是$db_item

$db_item = [
    ['id' => 1, 'stock' => 9539.00],
    ['id' => 2, 'stock' => 9468.00],
    ['id' => 3, 'stock' => 9295.00],
];

我想将第二个数组中的stock属性添加到第一个数组中。预期输出:

$cart = [
   ['id' => 3, 'weight' => 20, 'percentage' => 80, 'stock' => 9295.00],
   ['id' => 1, 'weight' => 50, 'percentage' => 80, 'stock' => 9539.00],
   ['id' => 2, 'weight' => 40, 'percentage' => 80, 'stock' => 9468.00],
];

这是我尝试过的方法,它可以工作,但是我认为没有必要具有foreacharray_filterarray_column

foreach ($cart as $key => $cart_item) {
    $item = array_filter($db_item, function($item) use ($cart_item) {
        return $item['id'] === $cart_item['id'];
    });
    $cart[$key]['stock'] = array_column($item, 'stock')[0];
}

任何人都有更好的主意如何优化它?


[EDIT: Mohammad's answer之后,我可以在第二个数组中使用更多属性

$keys = [];
foreach ($arr2 as $item) {
    $keys[$item['id']] = array(
        'attr1' => $item['attr1'],
        'attr2' => $item['attr2'],
        // and so on
    );
}

$newArr = array_map(function($item) use($keys){
    $item['attr1'] = $keys[$item['id']]['attr1'];
    $item['attr2'] = $keys[$item['id']]['attr2'];
    // and so on
    return $item;
}, $arr1);

EDIT2:发现我们可以使用array_column仅一行来简化foreach循环。

$keys = array_column($arr2, null, 'id');

$newArr = array_map(function($item) use($keys){
    $item['attr1'] = $keys[$item['id']]['attr1'];
    $item['attr2'] = $keys[$item['id']]['attr2'];
    // and so on
    return $item;
}, $arr1);
php arrays multidimensional-array
2个回答
2
投票

使用array_flip()array_column()的组合来创建数组,其中包含id和第二个数组的索引。

然后使用array_map()将新密钥stock添加到第一个数组。

$keys = array_flip(array_column($arr2, 'id'));
$newArr = array_map(function($item) use($keys, $arr2){ 
    $item['stock'] = $arr2[$keys[$item['id']]]['stock'];
    return $item;
}, $arr1);

检查demo中的结果

也可以使用foreach代替array_flip()

$keys = [];
foreach ($arr2 as $item)
    $keys[$item['id']] = $item['stock'];

$newArr = array_map(function($item) use($keys){ 
    $item['stock'] = $keys[$item['id']];
    return $item;
}, $arr1);

检查demo中的结果


1
投票

这也有帮助,一个array_column +一个array_map:

$arr2=array_column($arr2,'stock','id');
$arr1=array_map(function($val)use($arr2){$val['stock']=$arr2[$val['id']];return $val;},$arr1);

推荐问答