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)
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)
在演示中检查结果