2016-12-12 2 views
1

J'ai deux tableaux multidimensionnels:Fusionner des tableaux multidimensionnels avec id commun

Premier tableau Pizzas:

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" 
] 

Deuxième tableau Ingrédients:

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 
] 

Je veux fusionner ces deux réseaux les reliant par pizza_id. L'un des Pizza Ids n'a pas tableau de correspondance des ingrédients (les ingrédients sont inconnus) donc pour cette pizza que je veux mettre les ingrédients pour null et obtenir le prochain tableau:

New PizzaAndIngredients de tableau:

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 
] 

I ont été bidouiller avec array_merge, foreach, etc, mais ne peut pas obtenir le tableau. L'alternative est de construire une nouvelle requête et de joindre des pizzas et des ingrédients de gauche, mais dans la vraie vie, les tableaux sont beaucoup plus compliqués et cela signifierait dupliquer beaucoup de code. J'espérais une solution plus efficace pour fusionner les deux réseaux multi-dimensionnels.

Ma dernière tentative:

$PizzaAndIngredients = array(); 
foreach ($pizzas as $key => $values) { 
    $PizzaAndIngredients[$key] = array_merge($ingredients, $values); 
} 

Répondre

2

Lorsque vous allez chercher les lignes de résultats de la requête, vous pouvez définir les clés du tableau égal au pizza_id, ou ré-indexer par le pizza_id:

$pizza  = array_column($pizza, null, 'pizza_id'); 
$ingredients = array_column($ingredients, null, 'pizza_id'); 

Ensuite, il suffit de créer un tableau par défaut de null s à utiliser si les $ingredients n'existent pas, puis fusionner les valeurs $ingredients avec les valeurs $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); 
} 
+0

Cela ressemble à une façon intéressante d'aller. Existe-t-il un moyen plus efficace de créer le tableau par défaut (null)? Depuis le tableau des ingrédients dans la réalité a plus de 30 valeurs. Puis-je copier un tableau d'ingrédients existant et mettre toutes les valeurs à zéro? – zef

+0

Oui. Edited un défaut dynamique. – AbraCadaver

+0

Testé et travaillé! Impressionnant! Merci beaucoup. Btw. J'ai trouvé un moyen un peu plus efficace de définir l'arrya null par défaut: $ keys = array_keys (reset ($ ingredients)); $ default = array_fill_keys ($ keys, null); – zef