2009-12-07 91 views
7

我需要将几个数组合并成一个数组。描述我正在寻找的最好方法是将这些数组“交错”成单个数组。将多个数组交织到一个数组中

例如从数组#1中取项目1并追加到最终数组。从数组#2获取项目1并追加到最终数组。从数组#1获取项目2并追加...等。

最终阵列会是这个样子:

阵列#1.element#1 阵列#2.element#1 。 。 。

“踢球者”是各个阵列可以有不同的长度。

是否有更好的数据结构使用?

+1

请进一步解释如何在阵列具有不同长度的情况下期待您的结果。如果其中一个阵列到达最后一个元素,或者是否希望剩余阵列继续交错直到所有阵列都达到其最后一个元素,您会停止交错吗? – Oskar 2009-12-07 15:07:15

回答

25

例如,

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 
+0

我喜欢这一款。 – Franz 2009-12-07 15:26:36

+0

很棒的代码!如果任何人需要一个详细的一步一步的解释如何这个函数的工作原理,请查看[此线程在这里](http://stackoverflow.com/questions/34482028/explain-how-this-custom-function-works-php):) – Acidon 2015-12-27 17:19:40

1

我只是使用array_merge(),但这显然取决于你究竟做了什么。

这会将这些数组附加到对方,而元素只有在具有相同的非数字键时才会被替换。这对你来说可能不是问题,或者可能因为属性顺序而被解决,因为第一个数组元素的内容将被后面的元素覆盖。

0

如果您有n个数组,则可以使用SortedList,并使用arrayIndex * n + arrayNumber作为排序索引。

3

如果阵列中只有数字键,这里有一个简单的解决方案:

$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]作为单独的数组)。