#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);
это результат