Maison > Questions et réponses > le corps du texte
Je souhaite fusionner deux tableaux en fonction de valeurs de colonne communes. Voici mes 2 tableaux :
$array1 = [ [ "total_process_per_category" => "6", "category_id" => "1" ], [ "total_process_per_category" => "2", "category_id" => "2" ] ]; $array2 = [ [ "total_pinned_per_category" => "16", "category_id" => "1" ], [ "total_pinned_per_category" => "4", "category_id" => "2" ] ];
Je souhaite fusionner ces tableaux pour obtenir :
array ( 0 => array ( 'total_process_per_category' => '6', 'total_pinned_per_category' => '16', 'category_id' => '1', ), 1 => array ( 'total_process_per_category' => '2', 'total_pinned_per_category' => '4', 'category_id' => '2', ), )
Comme vous pouvez le voir, les deux tableaux ont la même clé ['category_id'] et la même valeur.
Je souhaite obtenir un résultat où ['total_process_per_category'] et ['total_pinned_per_category'] sont placés ensemble sur le même tableau en fonction de leurs valeurs ['category_id'].
J'ai obtenu ceci en utilisant un foreach imbriqué mais ça a l'air moche. S'il vous plaît dites-moi une meilleure façon.
P粉3669463802023-11-10 00:52:21
Cela peut être fait sans "foreach imbriqué laid". Fusionnez les deux tableaux avant d'itérer, en les regroupant par valeurcategory_id. Une fois la boucle terminée, utilisez array_values() pour effacer les clés temporaires de premier niveau.
Code : (Démo) (array_reduce() version)
$result = []; foreach (array_merge($array1, $array2) as $row) { $result[$row['category_id']] = ($result[$row['category_id']] ?? []) + $row; } var_export(array_values($result));
Sortie :
array ( 0 => array ( 'total_process_per_category' => '6', 'category_id' => '1', 'total_pinned_per_category' => '16', ), 1 => array ( 'total_process_per_category' => '2', 'category_id' => '2', 'total_pinned_per_category' => '4', ), )
P粉0717437322023-11-10 00:45:48
Vous pouvez essayer array_reduce
:
$someVariable = 'someValue'; $result = array_reduce(array_merge($array1, $array2), function ($carry, $item) use ($someVariable) { if (isset($carry[$item['category_id']])) { $carry[$item['category_id']] = array_merge($carry[$item['category_id']], $item); } else { $carry[$item['category_id']] = $item; } return $carry; }, array()); var_dump($result);