У меня есть эти 2 массива.
Первый массив из пользовательского ввода $cart
:
array(3) {
[0]=>
array(3) {
["id"]=>"3"
["weight"]=>"20"
["percentage"]=>"80"
}
[1]=>
array(3) {
["id"]=>"1"
["weight"]=>"50"
["percentage"]=>"80"
}
[2]=>
array(3) {
["id"]=>"2"
["weight"]=>"40"
["percentage"]=>"80"
}
}
и второй массив, я делаю базу данных SELECT id, stock WHERE id IN (3,1,2)
, в результате $db_item
array(3) {
[0]=>
array(2) {
["id"]=>"1"
["stock"]=>"9539.00"
}
[1]=>
array(2) {
["id"]=>"2"
["stock"]=>"9468.00"
}
[2]=>
array(2) {
["id"]=>"3"
["stock"]=>"9295.00"
}
}
Я хочу добавить атрибут stock во втором массиве в первый массив.
Это то, что я пытался, и это работает, но я не думаю, что нужно иметь foreach
, array_filter
и array_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: обнаружил, что мы можем упростить цикл foreach с помощью одной строки, используя array_column
.
$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);