Heim > Fragen und Antworten > Hauptteil
Ich möchte zwei Arrays basierend auf gemeinsamen Spaltenwerten zusammenführen. Hier sind meine 2 Arrays:
$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" ] ];
Ich möchte diese Arrays zusammenführen, um Folgendes zu erhalten:
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', ), )
Wie Sie sehen können, haben beide Arrays denselben Schlüssel ['category_id'] und denselben Wert.
Ich möchte ein Ergebnis erhalten, bei dem ['total_process_per_category'] und ['total_pinned_per_category'] basierend auf ihren ['category_id']-Werten zusammen im selben Array platziert werden.
Ich habe das mithilfe von „nested foreach“ erhalten, aber es sieht hässlich aus. Bitte sagen Sie mir einen besseren Weg.
P粉3669463802023-11-10 00:52:21
这可以在没有“丑陋的嵌套 foreach”的情况下完成。在迭代之前合并两个数组,按category_id 值进行分组。循环结束后,使用 array_values() 清除临时的一级键。
代码:(演示) (array_reduce() 版本)
$result = []; foreach (array_merge($array1, $array2) as $row) { $result[$row['category_id']] = ($result[$row['category_id']] ?? []) + $row; } var_export(array_values($result));
输出:
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
你可以尝试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);