Объединение двух многомерных массивов по определенному ключу

Допустим, у меня есть следующие массивы:

Array
    (
        [0] => Array
            (
                [id] => 5
                [name] => Education
            )

        [1] => Array
            (
                [id] => 4
                [name] => Computers
            )

        [3] => Array
            (
                [id] => 7
                [name] => Science

        [4] => Array
            (
                [id] => 1
                [name] => Sports
            )
    )

и второе:

Array
    (
        [0] => Array
            (
                [id] => 1
                [title] => Sport
            )

        [1] => Array
            (
                [id] => 7
                [title] => Sci
            )

        [3] => Array
            (
                [id] => 4
                [title] => Comp

        [4] => Array
            (
                [id] => 5
                [title] => Edu
            )
    )

и желаемый результат-это:

Array
    (
        [0] => Array
            (
                [id] => 5
                [name] => Education
                [title] => Edu
            )

        [1] => Array
            (
                [id] => 4
                [name] => Computers
                [title] => Comp
            )

        [3] => Array
            (
                [id] => 7
                [name] => Science
                [title] => Sci

        [4] => Array
            (
                [id] => 1
                [name] => Sports
                [title] => Sport
            )
    )

мне удалось объединить эти массивы просто:

foreach($first as $key => $value){
    $result[$key] = array_merge($first[$key], $second[$key]);
}

но выход не комбинируется правильно:

Array
    (
        [0] => Array
            (
                [id] => 5
                [name] => Education
                [title] => Sport
            )

        [1] => Array
            (
                [id] => 4
                [name] => Computers
                [title] => Sci
            )

        [3] => Array
            (
                [id] => 7
                [name] => Science
                [title] => Comp

        [4] => Array
            (
                [id] => 1
                [name] => Sports
                [title] => Edu
            )
    )

проблема в том, что я хотел бы объединить эти массивы на том же id. Желаемая сортировка вывода должна быть такой же, как и в первом массиве.

как я могу этого достичь? Любой помощь очень ценится.

5 ответов


вы можете просто сделать вложенный цикл и проверить, если id значения совпадают, затем добавьте title to $first (или name до $second)

foreach($first as $key => $value){
    foreach($second as $value2){
        if($value['id'] === $value2['id']){
            $first[$key]['title'] = $value2['title'];
        }               
    }
}

код работает нормально. Ваши ожидания просто неверны. Например в одном массиве 4-й элемент id содержит 1, но в другом массиве 4-й элемент id это 5, так что ваш "объединить эти массивы на одном id" не имеет смысла, так как при слиянии 4-х элементов в один вы также объединяете своих детей, и так как id используется в обоих массивах, как только значение должно исчезнуть, поскольку в массиве не может быть двух одинаковых ключей.

редактировать

вы должны слияние вручную как слияние функций PHP на основе ключи в то время как вы хотите объединить на основе контент:

$result = array();
foreach( $arrayA as $keyA => $valA ) {
  foreach( $arrayB as $keyB => $valB ) {
     if( $valA['id'] == $valB['id'] ) {
       $result[$keyA] = $valA + $valB;

       // or if you do not care output keys, just
       // $result[] = $valA + $valB;
     }
  }
}

пока оба массива всегда имеют каждый идентификатор в них, как насчет сортировки двух массивов по этому полю "id", а затем позволить php выполнить слияние?

function cmp($a, $b) {
  return ((int) $a['id'] < (int) $b['id']) ? -1 : 1;
}

usort($array1, 'cmp');
usort($array2, 'cmp');

$result = array_merge($array1, $array2);

не тестировали код, но он демонстрирует идею.


Не используйте foreach в foreach, это может быть слишком медленно, когда массив такой большой.

$idArray = array_column($secondArray,'title','id');
foreach($firstArray as $key => $val){
  $firstArray[$key]['title'] = (isset($idArray[$val['id']]) ? $idArray[$val['title'] : 'some title';
}

убедитесь, что элементы находятся в том же порядке:

$items = array_map(function($itemFirstArray, $itemSecondArray) {
  return array_merge($itemFirstArray, $itemSecondArray);
}, $firstArray, $secondArray);