Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interleaving multiple arrays into a single array

Tags:

arrays

php

I need to merge several arrays into a single array. The best way to describe what I'm looking for is "interleaving" the arrays into a single array.

For example take item one from array #1 and append to the final array. Get item one from array #2 and append to the final array. Get item two from array #1 and append...etc.

The final array would look something like this:

array#1.element#1 array#2.element#1 . . .

The "kicker" is that the individual arrays can be of various lengths.

Is there a better data structure to use?

like image 287
spdaly Avatar asked Dec 07 '09 14:12

spdaly


2 Answers

for example,

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
like image 73
user187291 Avatar answered Oct 14 '22 13:10

user187291


If the arrays only have numeric keys, here's a simple solution:

$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];
}

If you have named keys you can use the array_keys function for each array and loop over the array of keys instead.

If you want more than two arrays (or variable number of arrays) then you might be able to use a nested loop (though I think you'd need to have $arr[0] and $arr[1] as the individual arrays).

like image 3
DisgruntledGoat Avatar answered Oct 14 '22 12:10

DisgruntledGoat