PHP, объединяющий все остальные массивы

#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 .