2009-12-07 93 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]作爲單獨的數組)。