PHP как объединить массив и создать новый массив

#php #arrays #multidimensional-array #array-merge

Вопрос:

У меня есть 3 таких массива :

 $first = array(
    [0] => 13
    [1] => 66
    [2] => 15
)

$second = array
(
    [0] => append
    [1] => prepend
    [2] => append
)

$third = array
(
    [0] => 2
    [1] => 4
    [2] => 1
)
 

Теперь я хочу объединить эти 3 массива и создать новый ЕДИНЫЙ массив следующим образом :
Я хочу получить значение из каждого массива и объединить его в один.

 $new_array = array(

    [0] = array (
        'page'=>13,
        'position'=>'append'
        'priority'=>'2'
    )
    [1] = array (
        'page'=>66,
        'position'=>'prepend'
        'priority'=>'4'
    )
    [2] = array (
        'page'=>15,
        'position'=>'append'
        'priority'=>'1'
    )
)
 

Как это сделать?

Комментарии:

1. Вы берете страницу из первого массива, позицию из второго и приоритет из третьего. Что не так с простым foreach() ? Используйте один из массивов в качестве руководства для получения index ( foreach (array_keys($first) as $k) { ), а затем создайте новый элемент массива [ 'page' => $first[$k], 'position' => $second[$k], 'priority' => $third[$k] ] . Затем добавьте элемент в растущий результирующий массив.

2. Поскольку каждый элемент имеет 3 индекса, вы можете выполнить for() цикл, ссылку $first[$i] $second[$i] $third[$i] и создать новый массив. Вы пробовали что-нибудь? Вам нужно показать свою попытку и любые проблемы, с которыми вы сталкиваетесь; Stackoverflow не является бесплатным сервисом кодирования

3. Хорошо, @lserni сработал для меня. Я понял это.

4. Неужели ты сдался???

5. @abracadaver, Нет, я в отпуске на Дивали. Здесь, в Индии, празднуют фестиваль Дивали

Ответ №1:

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

 $first = array(13, 66, 15);
$second = array('append', 'prepend', 'append');
$third = array(2, 4, 1);

print_r(
    array_map(
        function($page, $position, $priority) {
            return compact('page', 'position', 'priority');
        },
        $first,
        $second, 
        $third
    )
);
 

Хотя в этом случае с тривиальной структурой foreach() может быть альтернативой.

Редактировать: версия 2. Некоторые могут возразить, что это хуже из-за удобочитаемости и, следовательно, удобства сопровождения кода. Благодаря AbraCadaver

 $keys = ['page', 'position', 'priority'];

// Note: The order in $keys and array_map() arguments must be the same
// On the other hand you only need to type the keys once and it's easy
// to change the number of arguments :)

print_r(
    array_map(
        function(...$args) use ($keys) {
            return array_combine($keys, $args);
        },
        $first,
        $second, 
        $third
    )
);
 

Редактировать: версия 3. Используя немного более современный PHP (7.4) с функциями со стрелками:

 print_r(
    array_map(
        fn(...$args) => array_combine($keys, $args),
        $first,
        $second, 
        $third
    )
);
 

Комментарии:

1. Аааа compact , здорово!

2. @AbraCadaver Да, некоторым это нравится, некоторым нет :). Но я подумал, что в этом случае это сэкономит время на вводе повторяющихся клавиш. Вероятно, можно было бы сделать еще один шаг вперед, используя ваш подход $keys и аргументы функции. Я думаю. Но это тоже приятно с некоторой удобочитаемостью :)..

Ответ №2:

Просто сопоставьте каждый элемент каждого массива и верните массив с ключами:

 $result = array_map(function($f, $s, $t) {
                        return ['page'=>$f, 'position'=>$s, 'priority'=>$t];
                    }, $first, $second, $third);
 

Или определите ключи вне функции и объедините с каждым элементом:

 $keys = ['page', 'position', 'priority'];
$result = array_map(function($f, $s, $t) use($keys) {
                        return array_combine($keys, [$f, $s, $t]);
                    }, $first, $second, $third);
 

Ответ №3:

Если у вас есть тот же столбец, вы можете сделать это следующим образом

 $first = [13,66,15];
$second = ['append','prepend','append'];
$third = [2,4,1];

foreach($first as $v => $i){
    $new_array[] = [
    'page' => $i,
    'position' => $second[$v],
    'priority' => $third[$v],
    ];
}

print_r($new_array);
 

это результат

введите описание изображения здесь