У меня два многомерных массива:
Первый массив Пиццы:
0 => array:2 [▼ "pizza_id" => 11 "pizza_name" => "Hawaï" ] 1 => array:2 [▼ "pizza_id" => 12 "pizza_name" => "Tonno" ] 2 => array:2 [▼ "pizza_id" => 13 "pizza_name" => "Surprise" ]
Второй массив Ингредиенты:
0 => array:4 [▼ "pizza_id" => 11 "ingredient_one" => "Ananas" "ingredient_two" => "Onion" "ingredient_three" => "Ham" ] 1 => array:4 [▼ "pizza_id" => 12 "ingredient_one" => "Tuna" "ingredient_two" => "Onion" "ingredient_three" => null ]
Я хочу объединить эти два массива, связывая их с помощью pizza_id
. Один из идентификаторов пиццы не имеет подходящего массива для ингредиентов (ингредиенты неизвестны), поэтому для этой пиццы я хочу установить ингредиенты в null
и получить следующий массив:
Новый массив PizzaAndIngredients:
0 => array:5 [▼ "pizza_cid" => 11 "pizza_name" => "Hawaï" "ingredient_one" => "Ananas" "ingredient_two" => "Onion" "ingredient_three" => "Ham" ] 1 => array:5 [▼ "pizza_id" => 12 "pizza_name" => "Tonno" "ingredient_one" => "Tuna" "ingredient_two" => "Onion" "ingredient_three" => null ] 2 => array:5 [▼ "pizza_id" => 13 "pizza_name" => "Surprise" "ingredient_one" => null "ingredient_two" => null "ingredient_three" => null ]
Я array_merge
с array_merge
, foreach
и т. Д., Но не могу получить массив. Альтернативой является создание нового запроса, а также добавление пиццы и ингредиентов, но в реальной жизни массивы намного сложнее, и это будет означать дублирование большого количества кода.
Я надеялся на более эффективное решение слияния двух многомерных массивов.
Моя последняя попытка:
$PizzaAndIngredients = array(); foreach ($pizzas as $key => $values) { $PizzaAndIngredients[$key] = array_merge($ingredients, $values); }
Когда вы извлекаете строки из результатов запроса, вы можете установить ключи массива равными pizza_id
или переиндексировать их с помощью pizza_id
:
$pizza = array_column($pizza, null, 'pizza_id'); $ingredients = array_column($ingredients, null, 'pizza_id');
Затем просто создайте массив по умолчанию, равный null
чтобы использовать, если $ingredients
не существует, а затем объедините значения $pizza
значениями $pizza
:
//get an ingredient array $temp = reset($ingredients); //combine keys and an array of nulls $default = array_combine(array_keys($temp), array_fill(0, count($temp), null)); foreach($pizza as $id => $p_values) { //check if $ingredients[$id] exists, if not use the default $i_values = isset($ingredients[$id]) ? $ingredients[$id] : $default; //you can also use just $result[] if you don't need the pizza_id as key $result[$id] = array_merge($i_values, $p_values); }