如何通过唯一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);