#php #multidimensional-array #array-merge
#php #многомерный массив #массив-слияние
Вопрос:
просто любопытно, знает ли кто-нибудь, как объединить все остальные подмассивы,
он же
$tmp = array();
$tmp[0] = array(false);
$tmp[1] = array(false);
$tmp[2] = array(false);
$tmp[3] = array(false);
$tmp[4] = array(false);
$tmp[5] = array(false);
или….
0 1
2 3
4 5
что-то вроде этого, я думаю?
$i=0; $new=array();
foreach($tmp as $k=>$v) {
$tmp[$k] = $v;
if($i=$k-1) {
$new[] = $tmp[$i] $tmp[$i-1]; /* or something ridiculous like that */
}
$i ;
}
Комментарии:
1. Какой именно был смысл редактировать это И отклонять его, особенно после того, как это было решено и принято. Смешно….
Ответ №1:
$new = array();
for ($i = 0, $cnt = count($tmp); $i < $cnt; $i = 2) {
$new[] = $tmp[$i] $tmp[$i 1];
}
Комментарии:
1. Массив с нечетным числом записей приводит к сбою с «Notice: Undefined offset:» и «Fatal error: неподдерживаемые типы операндов», как я отметил ниже.
2. @nickb: действительно, но у меня не было цели выполнять всю работу @ehime, но я дал ему идею о том, как написать базу. Кстати, это приведет к сбою в случае, когда
$tmp[$i]
это не массив, а объект, и я не занимаюсь этим, потому что это выходит за рамки вопроса.3. всегда есть четное число, и в случае, если это объект, вы всегда можете использовать приведение строки $ mp = (array) $ tmp; так что это не проблема.
Ответ №2:
Используя array_chunk
и array_merge
, вы можете придумать довольно простое решение
<?php
$result = array_chunk($tmp, 2);
foreach ($result as amp;$chunk)
{
$chunk = array_merge($chunk[0], $chunk[1]);
}
Комментарии:
1. В случае, если фрагмент содержит более двух элементов,
call_user_func_array('array_merge', $chunk)
также работает.2. Оо! Еще лучше. Спасибо за информацию.
3. даже если это выглядит сложно и «красиво» — я бы никогда не написал такой неочевидный код в продакшене (да, для меня это выглядит немного сложным для чтения и понимания)
Ответ №3:
Предполагается, что массив содержит четное количество записей. Если это не так, или если вы хотите объединить 0 1, 1 2, 2 3, измените приращение на $i
на 1 и измените присвоение $j
на $j = count( $tmp) - 1
$tmp = array();
$tmp[0] = array(false);
$tmp[1] = array(false);
$tmp[2] = array(true);
$tmp[3] = array(true);
$new = array();
for( $i = 0, $j = count( $tmp); $i < $j; $i = 2)
{
$new[] = array_merge( $tmp[$i], $tmp[$i 1]);
}
Вывод
array(2) {
[0]=>
array(2) {
[0]=>
bool(false)
[1]=>
bool(false)
}
[1]=>
array(2) {
[0]=>
bool(true)
[1]=>
bool(true)
}
}
Комментарии:
1. Вы также могли бы написать это с помощью array_walk .