PHP объединяет два массива по одному ключу

Я два массива изложил так.

Первый массив

Array
(
    [0] => Array
        (
            [manufacture] => Moto
            [name] => ZSX 125
            [code] => ZS125-48A
            [cc] => 125
            [bike_type] => 3 Motorcycle
            [title] => Mto ZSX 125 
            [about] => The ZSX 
        )

    [1] => Array
        (
            [manufacture] => Moto
            [name] => LSM 125
            [code] => STR125YB
            [cc] => 125
            [bike_type] => 6 Endurancemotor
            [title] => Moto 
            [about] => Moto 
        )
)

Второй массив

Array
(
    [0] => Array
        (
            [id] => 183
            [model] => ZS125-48A
            [engine_brand] => 158FMI-B
            [engine_type] => Single Cylinder
        )

    [1] => Array
        (
            [id] => 172
            [model] => STR125YB
            [engine_brand] => K154FMI
            [engine_type] => Single Cylinder
        )
)

Как видите, «код» из первого массива совпадает с «моделью» из второго, и всегда будет совпадение.

Это массив, который я хотел бы иметь.

Array
(
    [0] => Array
        (
            [id] => 183
            [model] => ZS125-48A
            [engine_brand] => 158FMI-B
            [engine_type] => Single Cylinder
            [manufacture] => Moto
            [name] => ZSX 125
            [code] => ZS125-48A
            [cc] => 125
            [bike_type] => 3 Motorcycle
            [title] => Moto ZSX 125 
            [about] => The ZSX 
        )

    [1] => Array
        (
            [id] => 172
            [model] => STR125YB
            [engine_brand] => K154FMI
            [engine_type] => Single Cylinder
            [manufacture] => Moto
            [name] => LSM 125
            [code] => STR125YB
            [cc] => 125
            [bike_type] => 6 Endurancemotor
            [title] => Moto 
            [about] => Moto 
        )
)

Это возможно? я пробовал array_merge и array_merge_recursive, но он только добавляет второй массив в конец первого, он не объединяет его с ключами.


person user3004208    schedule 11.12.2013    source источник
comment
Мне кажется, что-то извлеченное из БД. Если это так, не будет ли проще ОБЪЕДИНИТЬ результаты в столбце model   -  person Royal Bg    schedule 11.12.2013


Ответы (3)


Решение Deceze идеально, если два массива синхронизированы (т. е. элементы с совпадающими code и model имеют один и тот же индекс в обоих массивах). Если это не так, вам понадобится более одной строки кода.

Массивы должны иметь строковые ключи, чтобы их можно было объединить с array_merge. В этом случае вы хотите переназначить первый на основе code, а второй на основе model. После смены ключей вы можете объединить их с array_merge_recursive.

Сменить ключ в PHP 5.5+ легко:

// array_column will conveniently rekey when the second argument is null
$array1 = array_column($array1, null, 'code');
$array2 = array_column($array2, null, 'model');

Немного сложнее в более ранних версиях:

// array_map is a more complicated way to extract a column from an array
// and array_combine will do the rekeying
$array1 = array_combine(
              array_map(function($i) { return $i['code']; }, $array1),
              $array1);
$array2 = array_combine(
              array_map(function($i) { return $i['model']; }, $array2),
              $array2);

В обоих случаях последний шаг будет одинаковым:

$result = array_merge_recursive($array1, $array2);
person Jon    schedule 11.12.2013
comment
+1 за подробное объяснение и решение :) Я думаю, что массивы синхронизированы, мне они кажутся извлечениями из БД, что заставляет меня думать, что ОП может напрямую присоединять результаты к MODEL=>CODE при выборе, но это просто дикая догадка :) - person Royal Bg; 11.12.2013

Мне кажется, что это должно сделать это:

$array3 = array_map('array_merge', $array1, $array2);

Это подает $array1[0] и $array2[0] в array_merge, затем $array1[1] и $array2[1] и т. д.

person deceze♦    schedule 11.12.2013
comment
Это нормально, но для удовлетворения всех требований OP он должен быть $array3 = array_map('array_merge', $array2, $array1);, поэтому массив2 с ключами идентификатора будет добавлен. +1 от меня - person Royal Bg; 11.12.2013

И, если вы предпочитаете "более простой" код... :-)

$result = array();
foreach ($one as $a) {
    foreach ($two as $b) {
        if ($a->code == $b->model) {
           array_push($result, array_merge($a, $b));
           break;
        }
    }
}
print_r($result);
person MarcoS    schedule 11.12.2013