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

Chr*_*ius 5 php arrays multidimensional-array

我有这两个数组.

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

$cart = [
   ['id' => 3, 'weight' => 20, 'percentage' => 80],
   ['id' => 1, 'weight' => 50, 'percentage' => 80],
   ['id' => 2, 'weight' => 40, 'percentage' => 80],
];
Run Code Online (Sandbox Code Playgroud)

和第二个数组,我做了一个数据库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],
];
Run Code Online (Sandbox Code Playgroud)

我想将第二个数组中的stock属性添加到第一个数组中.这是我试过了,和它的作品,但我不认为这是需要有foreach,array_filter以及array_column:

$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],
];
Run Code Online (Sandbox Code Playgroud)

谁都有更好的想法如何优化这个?


编辑:按照穆罕默德的回答,我可以在第二个数组中使用更多属性

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];
}
Run Code Online (Sandbox Code Playgroud)

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

$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);
Run Code Online (Sandbox Code Playgroud)

Moh*_*mad 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);
Run Code Online (Sandbox Code Playgroud)

在演示中检查结果

您也可以使用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);
Run Code Online (Sandbox Code Playgroud)

在演示中检查结果