2015-12-27 13 views
6

Qui questa funzione in PHP che permette di unire qualsiasi quantità N di diverse matrici di lunghezza in un modo che array di uscita sarà in ordine successivo: Array1[0],Array2[0],..,ArrayN[0],Array1[1],Array2[1],..,ArrayN[1]...:spiegare come funziona questa funzione personalizzata PHP

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 

Pur comprendendo quello che ognuno di funzioni incorporate in questo esempio fa da solo, non riesco a capirmi come tutto funzioni insieme, nonostante includa commenti esplicativi ...

Qualcuno può scomporlo per me, per favore? La funzione funziona bene così com'è, mi fa impazzire che non capisco come funziona ...

P.S: questa funzione è presa dalla domanda Interleaving multiple arrays into a single array.

+0

Scrivi tu stesso una funzione simile, ti darà un'idea di ciò che è necessario. Le probabilità sono che tu eventualmente riscrivi sopra il codice te stesso.Detto questo, ispeziona il contenuto delle variabili nel codice sopra in diversi punti di esecuzione per avere un'idea di cosa fa. –

risposta

2

Gli array $a, $b e $c hanno rispettivamente 10, 6 e 2 elementi.

$a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
$b = ['a', 'b', 'c', 'd', 'e', 'f']; 
$c = ['A', 'B']; 

Quando si nutrono gli array come argomenti della funzione array_zip_merge(), guardare il ciclo for. Lo func_get_args() imposterà lo $args con tutti gli argomenti forniti. All'avvio della prima esecuzione for ciclo,

$args = [$a, $b, $c]; 
count($args) = 3; 

Al ciclo foreach il array_shift restituirà il primo elemento di ciascun array risultante il $output essere come

$output = [1, 'a', 'A']; 

E le matrici ora sembrano,

$a = [2, 3, 4, 5, 6, 7, 8, 9, 10]; 
$b = ['b', 'c', 'd', 'e', 'f']; 
$c = ['B']; 

Alla fine del primo ciclo for la funzione array_filter non sarà est se qualche array è vuoto e rimuovilo da $args. Stessa cosa accadrà alla seconda manche, ed entro la fine del secondo ciclo for, le variabili sarebbe simile

$a = [3, 4, 5, 6, 7, 8, 9, 10]; 
$b = ['c', 'd', 'e', 'f']; 
$c = []; 
$output = $output = [1, 'a', 'A', 2, 'b', 'B']; 
//because $c is empty array_filter() removes it from $args 
$args = [$a, $b]; 

Quindi, sulla terza iterazione del ciclo forcount($args) tornerà 2. Quando l'ultimo elemento di $b è stato rimosso da array_shift, lo count($args) restituirà 1. L'iterazione continuerà finché tutti gli array non saranno vuoti

+0

Grazie per una risposta così dettagliata, le iterazioni passo passo mi hanno chiarito le cose, e finalmente tutto ha cominciato a dare un senso :))) – Acidon

0

All'interno array_zip_merge, l'istruzione per prende sempre primi valori di ogni matrice e aggiungerli al uscita rispettivamente variabile.

Perché array_shift rimuove l'elemento restituito, su ogni ciclo i primi elementi sono diversi. Quando diventa vuoto a causa di esso, il ciclo non ha nulla da fare e si rompe.

Se ancora non capisci, chiedi la parte specifica del codice che hai problemi con per favore.

Problemi correlati