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

如何通过唯一id组合对象的php数组?,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有这两个数组 第一个数组来自用户输入$cart: $cart = [ ['id' => 3, 'weight' => 20, 'percentage' => 80], ['id' => 1, 'weight' => 50, 'percentage' => 80], ['id' => 2, 'weight' => 40, 'percentage' => 80], ]; 第二个数组,我做一个数据库选择id,在(3,1,2)中

我有这两个数组

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

$cart = [
   ['id' => 3, 'weight' => 20, 'percentage' => 80],
   ['id' => 1, 'weight' => 50, 'percentage' => 80],
   ['id' => 2, 'weight' => 40, 'percentage' => 80],
];
第二个数组,我做一个数据库
选择id,在(3,1,2)
中存储id,结果是
$db\u项

$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],
];
这是我尝试过的,它是有效的,但我认为没有必要使用
foreach
array\u filter
、和
array\u 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];
}
有谁知道如何优化这个吗


编辑:接下来,我可以在第二个数组中使用更多属性

$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\u 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);

使用
array\u flip()
array\u column()
的组合来创建包含第二个数组的
id
和索引的数组

然后使用
array\u 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);
检查结果

您还可以使用
foreach
而不是
array\u flip()


检查

中的结果这也有帮助,一个数组列+一个数组映射:

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

为什么不在一个查询中获取所有必需的数据呢。如果您向我们展示这两个查询,有人会告诉您如何在一个查询中获取所有信息query@RiggsFolly但是第一个数组来自用户输入,而不是查询,好的方面:)没有找到:):(有趣的是,我在购物车系统中使用了这种性质的东西,但我只使用了两个foreach…这很可能与array_filter的性能相同,因为它在数组上的滚动是一样的。我们谈论的是迷你毫秒,所以你可能对你拥有的东西没什么意见…除非你只是想让它更易于阅读未来的代码。在编程中,优化数组查找的最佳方法之一是使用哈希表。PHP的关联数组是一种易于使用的形式。但是,当只处理少数元素时,我认为任何优化都是过度优化。这是我第一次看到使用array_flip。好主意,顺便说一句,它是2行它比较短。但是做数组翻转+数组列+数组映射不是也在做3个循环吗?就像我上面的解决方案一样?我喜欢你的第二个解决方案,将我的代码更改为使用你的。哦,很好,以前不知道数组列的第三个参数。
$arr2=array_column($arr2,'stock','id');
$arr1=array_map(function($val)use($arr2){$val['stock']=$arr2[$val['id']];return $val;},$arr1);