2015-06-30 12 views
12

Ho una matrice su cui eseguo il loopover. Ho un'altra matrice da cui ho bisogno di selezionare uno per uno, ma ha bisogno di andare in cerchio nel caso in cui arriva alla fine della matrice. Per chiarire qui è un codice:Tratta un array come array circolare quando selezioni gli elementi - PHP

$mainArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
$size  = count($mainArray); 
$circular = array('A', 'B', 'C'); 

for($i = 0; $i < $size; $i++) { 
    echo $mainArray[$i] . ' = ' . $circular[$i] . ', '; 
} 

Ora sopra le stampe di codici a questo:

1 = A, 2 = B, 3 = C, UNDEFINED INDEX ERROR 

Che cosa ho bisogno per stampare è questo:

1 = A, 2 = B, 3 = C, 4 = A, 5 = B, 6 = C, 7 = A, 8 = B, 9 = C, 10 = A 

C'è una costruito nel funzione di PHP che trasforma una matrice in un array circolare? Penso di aver bisogno di usare l'operatore modulare per raggiungere questo obiettivo.

risposta

18

Ottenere la dimensione dell'array circolare ($circsize) e poi mod il valore $i contro di essa e utilizzarlo come l'indice:

$mainArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
$size  = count($mainArray); 
$circular = array('A', 'B', 'C'); 
$circsize = count($circular); 

for($i = 0; $i < $size; $i++) { 
    echo $mainArray[$i] . ' = ' . $circular[$i % $circsize] . ', '; 
} 
2

utilizzate il resto per l'indice di matrice circolare:

$i2= $i % count($circular); 
echo $mainArray[$i] . ' = ' . $circular[$i2] . ', '; 

In alternativa, è possibile utilizzare foreach per iterare attraverso gli array ed evitare l'utilizzo di calcoli aritmetici per l'indice:

reset($circular); 
foreach($mainArray as $item){ 
    echo $item . ' = ' . current($circular); 
    if(next($circular)===false) reset($circular); 
} 
6

Mi piace Chris Walsh ma qui è un alternativa che funziona anche per gli array associativi (indici non interi). Probabilmente potrebbe essere accorciato:

foreach($mainArray as $main) { 
    if(($circ = current($circular)) === false) { 
     $circ = reset($circular); 
    } 
    next($circular); 
    echo "$main=$circ "; 
} 

Se avete bisogno di questo più di una volta, forse una funzione:

function circular(&$array) { 
    if(($result = current($array)) === false) { 
     $result = reset($array); 
    } 
    next($array); 

    return $result; 
} 

Poi basta usare:

foreach($mainArray as $main) { 
    $circ = circular($circular); 
    echo "$main=$circ "; 
} 
+0

Questo non funzionerà se il valore di un elemento di matrice è Falsey. 'circular' tornerà all'inizio dell'array ogni volta che raggiunge quell'elemento. – Barmar

+0

Grazie. Modificato per controllare '=== false'. Quindi l'elemento dell'array potrebbe essere "falso" ma oh, va bene. – AbraCadaver

+0

Questo tipo di soluzione funziona fintanto che 'false' non è un elemento valido dell'array. La soluzione che utilizza il modulo funziona più in generale. – Barmar

1

Se si utilizza PHP 5.5 o superiore, quindi è possibile utilizzare php generators e la sua parola chiave yield:

Quindi questo metodo eseguirà il ciclo sull'array dato per 1000 volte a meno che non si passi un altro valore per l'argomento $limit. qui è il caso d'uso:

foreach (loopOnArrayFor(['A','B','C'],5) as $v) { 
    echo "$v ,"; 
} 

che si traduce nella seguente output:

A ,B ,C ,A ,B ,C ,A ,B ,C ,A ,B ,C ,A ,B ,C , 

Un piccolo aggiustamento ci darà il risultato atteso:

$counter = 1; 
foreach (loopOnArrayFor(['A','B','C'],5) as $v) { 
    echo $counter++ . ' = ' . $v .', ' ; 
} 

Qualcosa di simile:

1 = A, 2 = B, 3 = C, 4 = A, 5 = B, 6 = C, 7 = A, 8 = B, 9 = C, 10 = A, 11 = B, 12 = C, 13 = A, 14 = B, 15 = C, 

P. S.Quello che stai cercando, può facilmente portare all'esaurimento della memoria, quindi se puoi, trova un'altra soluzione invece di fare affidamento su un ciclo infinito (controllato) :)

Problemi correlati