2009-12-07 10 views
7

Ho bisogno di unire più array in un singolo array. Il modo migliore per descrivere quello che sto cercando è "interleaving" degli array in un singolo array.Interleaving di più array in un singolo array

Ad esempio, prendere l'elemento 1 dall'array # 1 e aggiungerlo all'array finale. Ottieni l'articolo 1 dall'array # 2 e aggiungilo all'array finale. Ottieni l'elemento due dall'array # 1 e aggiungi ... ecc.

L'array finale sarebbe simile a questa:

serie # 1.element # 1 serie # 2.element # 1 . . .

Il "kicker" è che i singoli array possono essere di varie lunghezze.

Esiste una struttura dati migliore da utilizzare?

+1

Si prega di spiegare ulteriormente come si prevede il risultato nel caso in cui gli array hanno varie lunghezze. Fermeresti l'interleaving quando uno degli array ha raggiunto il suo ultimo elemento o vuoi che gli array rimanenti continuino a essere interfogliati fino a quando tutti gli array hanno raggiunto il loro ultimo elemento? – Oskar

risposta

25

per esempio,

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

Mi piace questo. – Franz

+0

Grande pezzo di codice di sicuro! Se qualcuno ha bisogno di una dettagliata spiegazione passo passo di come funziona questa funzione, controlla [questo thread qui] (http://stackoverflow.com/questions/34482028/explain-how-this-custom-function-works-php) :) – Acidon

1

Vorrei solo usare array_merge(), ma questo ovviamente dipende da cosa esattamente si fa.

Questo accoderebbe gli array tra loro, mentre gli elementi verranno sostituiti solo se hanno la stessa chiave non numerica. E questo potrebbe non essere un problema per te, o potrebbe essere possibile risolverlo a causa dell'ordine degli attributi, dato che i contenuti degli elementi dei primi array saranno sovrascritti da quelli successivi.

0

Se si dispone di n array, è possibile utilizzare un SortedList e utilizzare arrayIndex * n + arrayNumber come indice di ordinamento.

3

Se gli array hanno solo tasti numerici, ecco una soluzione semplice:

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

Se il nome chiavi è possibile utilizzare la funzione array_keys per ogni array e ciclare invece sulla serie di chiavi.

Se si desidera più di due array (o numero variabile di array), è possibile utilizzare un ciclo annidato (anche se penso che sia necessario disporre di $arr[0] e di $arr[1] come matrici individuali).

Problemi correlati