Объединить значения из разных массивов в один с одним и тем же ключом

У меня есть два массива:

Array
(
    [0] => 5
    [1] => 4
)
Array
(
    [0] => BMW
    [1] => Ferrari
)

И я хотел бы иметь такой результат. Объедините значения с одним и тем же ключом

Array  
  (  
    [0] => Array  
      (  
        [0] => 5  
        [1] => BMW 
      )  
    [1] => Array  
      (  
        [0] => 4
        [1] => Ferrari 
      )  
  )  

Как я мог это сделать? Есть ли какая-нибудь встроенная функция PHP, которая делает это? Я пробовал array_merge_recursive и array_merge, но не получил ожидаемого результата


person Bruno Andrade    schedule 08.01.2019    source источник
comment
Я не могу отметить ваш ответ как решение вопроса. Но это решило это.   -  person Bruno Andrade    schedule 08.01.2019
comment
Должно быть, это обманщик.   -  person Progrock    schedule 08.01.2019
comment
Руководство по array_map: интересным применением этой функции является создание массива массивов, что можно легко выполнить, используя NULL в качестве имени функции обратного вызова, см. пример №4.   -  person Progrock    schedule 08.01.2019


Ответы (3)


Что касается комментария @splash58:

Вы можете использовать карту-массива. Вот пример:

$array = [["5", "4"], ["BMW", "Ferrari"]];
$res = array_map(null, ...$array);

Теперь res будет содержать:

Array
(
    [0] => Array
        (
            [0] => 5
            [1] => BMW
        )
    [1] => Array
        (
            [0] => 4
            [1] => Ferrari
        )
)

Если массив в двух разных переменных вы можете использовать:

$res= array_map(null, ["5", "4"], ["BMW", "Ferrari"]);
person dWinder    schedule 08.01.2019
comment
OP имеет два массива, так зачем их упаковывать, а затем распаковывать со знаком? - person Progrock; 08.01.2019
comment
Я цитирую сплеш58. Добавьте также способ сделать это с 2 массивами - person dWinder; 08.01.2019

<?php
$a = array();
$a[0] = '5';
$a[1] = '4';

$b = array();
$b[0] = 'BMW';
$b[1] = 'Ferrari';

merge_by_key($a, $b);

function merge_by_key($a, $b){
    $c = array();
    fill_array($c,$a);
    fill_array($c,$b);
    print_r($c);
}

function fill_array(&$c, $a) {
    foreach ($a as $key => $value){
        if(isset($c[$key])) {
            array_push($c[$key], $value);
        } else {
            $c[$key] = array($value);
        }
    }
}

Выход:

Array
(
    [0] => Array
        (
            [0] => 5
            [1] => BMW
        )

    [1] => Array
        (
            [0] => 4
            [1] => Ferrari
        )

)
person FedeCaceres    schedule 08.01.2019

Вы можете использовать array_map с нулевым значением в качестве первого аргумента (в руководстве есть пример), чтобы получить желаемый результат:

<?php

$nums = [0 => 5, 1 => 4];
$cars = [0 => 'BMW', 1 => 'Ferrari'];

var_export(array_map(null, $nums, $cars));

Выход:

array (
0 => 
array (
    0 => 5,
    1 => 'BMW',
),
1 => 
array (
    0 => 4,
    1 => 'Ferrari',
),
)

Обратите внимание, что следующий ввод даст тот же результат:

$nums = ['puff' => 5, 'powder' => 4];
$cars = ['powder' => 'BMW', 'puff' => 'Ferrari'];

Именно порядок, а не ключи, определяет пары в результате при использовании array_map, как указано выше.

Чтобы связать по ключу, используя foreach (обратите внимание на порядок $cars):

<?php
$nums = [0 => 5, 1 => 4];
$cars = [1 => 'Ferrari', 0 => 'BMW'];
foreach($nums as $k => $num)
    $result[] = [$num, $cars[$k]];

var_export($result);

Результаты также в желаемом результате.

person Progrock    schedule 08.01.2019