Предположим, у меня есть этот массив:
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]);
}
@dWinder, [other] => value
должен остаться в новом массиве. Для того, как объединить, значение должно быть объединено в ключевом порядке. Итак, первый из country
должен идти с первым из capital
...
Если ключи 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 месте...
В чем разница с вашим первым подходом?
Теперь код более общий — в первом посте я использовал строку country
и capital
3 раза.
Попробуйте использовать приведенный ниже код, он будет работать на 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>";
А как насчет
[other] => value
? как узнать, какое поле объединить?