Чередование нескольких массивов в один массив - PullRequest
9 голосов
/ 07 декабря 2009

Мне нужно объединить несколько массивов в один массив. Лучший способ описать то, что я ищу, - это «чередовать» массивы в один массив.

Например, взять первый элемент из массива # 1 и добавить к последнему массиву. Получить элемент один из массива # 2 и добавить в окончательный массив. Получить элемент два из массива # 1 и добавить ... и т. Д.

Конечный массив будет выглядеть примерно так:

массив # 1.element # 1 массив # 2.element # 1 , , .

«Кикер» заключается в том, что отдельные массивы могут быть различной длины.

Есть ли лучшая структура данных для использования?

Ответы [ 4 ]

28 голосов
/ 07 декабря 2009

например,

function array_zip_merge() {
  $output = array();
  // The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
  for ($args = func_get_args(); count($args); $args = array_filter($args)) {
    // &$arg allows array_shift() to change the original.
    foreach ($args as &$arg) {
      $output[] = array_shift($arg);
    }
  }
  return $output;
}

// test

$a = range(1, 10);
$b = range('a', 'f');
$c = range('A', 'B');
echo implode('', array_zip_merge($a, $b, $c)); // prints 1aA2bB3c4d5e6f78910
3 голосов
/ 07 декабря 2009

Если массивы имеют только цифровые клавиши, вот простое решение:

$longest = max( count($arr1), count($arr2) );
$final = array();

for ( $i = 0; $i < $longest; $i++ )
{
    if ( isset( $arr1[$i] ) )
        $final[] = $arr1[$i];
    if ( isset( $arr2[$i] ) )
        $final[] = $arr2[$i];
}

Если у вас есть именованные ключи, вы можете использовать функцию array_keys для каждого массива и вместо этого перебирать массив ключей.

Если вам нужно более двух массивов (или переменное число массивов), вы можете использовать вложенный цикл (хотя я думаю, что вам нужно иметь $arr[0] и $arr[1] как отдельные массивы).

1 голос
/ 07 декабря 2009

Я бы просто использовал array_merge(), но это, очевидно, зависит от того, что именно вы делаете.

Это добавит эти массивы друг к другу, в то время как элементы будут заменены только тогда, когда они имеют одинаковый нечисловой ключ. И это не может быть проблемой для вас, или может быть возможно решить из-за порядка атрибутов, так как содержимое элементов первых массивов будет перезаписано более поздними.

0 голосов
/ 07 декабря 2009

Если у вас есть n массивов, вы можете использовать SortedList и использовать arrayIndex * n + arrayNumber в качестве индекса сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...