Объединить два многомерных массива в PHP

Предположим, у меня есть этот массив:

Array
(
    [country] => Array
        (
            [0] => France
            [1] => Canada
        )
    [capital] => Array
        (
            [0] => Paris
            [1] => Ottawa
        )
    [other] => value
)

Можно ли объединить массивы country и capital?

Желаемый результат следующий:

Array
(
    [countries] => Array
        (
            Array 
                (
                    [country] => France
                    [capital] => Paris
            )
            Array 
                (
                    [country] => Canada
                    [capital] => Ottawa
            )
        )
    [other] => value
)

Что я пробовал:

$result = array();

foreach($arr as $key=>$array) {
    $result[$key] = array_merge($array, $arr2[$key]);
}

А как насчет [other] => value? как узнать, какое поле объединить?

dWinder 30.05.2019 14:21

@dWinder, [other] => value должен остаться в новом массиве. Для того, как объединить, значение должно быть объединено в ключевом порядке. Итак, первый из country должен идти с первым из capital...

Thomas 30.05.2019 14:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
42
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если ключи countries -> capitals и длина одинаковы, и вам нужно объединить только эти значения, вы можете просто увеличить один из массивов. Например:

$result = ['countries' => [], 'other' => $arr['other']];
for ($i = 0; $i < count($arr['country']); $i++) {
    $result['countries'][] = [
        'country' => $arr['country'][$i],
        'capital' => $arr['capital'][$i]
    ];
}
Ответ принят как подходящий

Если у вас есть известное поле для изменения, используйте:

$arr = ["country" => ["France", "Canada"], "capital" => ["Paris", "Ottawa"], "other" => "value"];
$keys = ["country", "capital"];

foreach($arr as $k => $v) {
    if (in_array($k, $keys)) {
        $slice[] = $v; // get the array which need to be merge
        unset($arr[$k]); // remove him from the original array
    }
}

$arr["countries"] = array_map(function ($e) use ($keys) {return array_combine($keys, $e);}, array_map(null, ...$slice));

И теперь $arr установлен.

Обратите внимание на использование оператора ... для взрыва массива $slice и array_map с null, которые объединяются в соответствии с ключами int.

Это самый общий способ, потому что если вы хотите изменить поле для слияния, вам нужно сделать это только в 1 месте...

В чем разница с вашим первым подходом?

Thomas 30.05.2019 14:33

Теперь код более общий — в первом посте я использовал строку country и capital 3 раза.

dWinder 30.05.2019 14:45

Попробуйте использовать приведенный ниже код, он будет работать на 100%

Спасибо.

<?php

$arr = [
    "country"=>["France","Canada"],
    "capital"=>["Paris","Ottawa"],
    "other"=>[]
];


$result = [
    "countries"=>[]
];

for($i=0;$i<count($arr["country"]);$i++){
    $data = [
        "country"=>$arr["country"][$i],
        "capital"=>$arr["capital"][$i]
    ];
    array_push($result["countries"],$data);
}


echo "<pre>";
print_r($result);
echo "</pre>";

Другие вопросы по теме