Heim  >  Fragen und Antworten  >  Hauptteil

Assoziative Arrays mit gemeinsamen Spaltenwerten zusammenführen

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粉966979765P粉966979765368 Tage vor598

Antworte allen(2)Ich werde antworten

  • P粉366946380

    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',
      ),
    )

    Antwort
    0
  • P粉071743732

    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);

    Antwort
    0
  • StornierenAntwort