Ricerca…


Sintassi

  • for ($ i = 0; $ i <count ($ array); $ i ++) {incremental_iteration (); }
  • for ($ i = count ($ array) - 1; $ i> = 0; $ i--) {reverse_iteration (); }
  • foreach ($ data come $ datum) {}
  • foreach ($ data come $ key => $ datum) {}
  • foreach ($ data as e $ datum) {}

Osservazioni

Confronto di metodi per iterare un array

Metodo Vantaggio
foreach Il metodo più semplice per iterare un array.
foreach per riferimento Semplice metodo per iterare e modificare elementi di un array.
for con indice incrementale Consente di ripetere l'array in una sequenza libera, ad esempio saltando o invertendo più elementi
Puntatori di array interni Non è più necessario usare un loop (in modo che possa iterare una volta ogni chiamata di funzione, ricevere il segnale, ecc.)

Iterazione di più matrici insieme

A volte due array della stessa lunghezza devono essere ripetuti insieme, ad esempio:

$people = ['Tim', 'Tony', 'Turanga'];
$foods = ['chicken', 'beef', 'slurm'];

array_map è il modo più semplice per realizzare questo:

array_map(function($person, $food) {
    return "$person likes $food\n";
}, $people, $foods);

che produrrà:

Tim likes chicken
Tony likes beef
Turanga likes slurm

Questo può essere fatto attraverso un indice comune:

assert(count($people) === count($foods));
for ($i = 0; $i < count($people); $i++) {
    echo "$people[$i] likes $foods[$i]\n";
}

Se i due array non hanno le chiavi incrementali, array_values($array)[$i] può essere usato per sostituire $array[$i] .

Se entrambi gli array hanno lo stesso ordine di chiavi, puoi anche utilizzare un ciclo foreach-with-key su uno degli array:

foreach ($people as $index => $person) {
    $food = $foods[$index];
    echo "$person likes $food\n";
}

Gli array separati possono essere collegati solo se hanno la stessa lunghezza e hanno lo stesso nome di chiave. Ciò significa che se non si fornisce una chiave e se sono numerati, si andrà bene, o se si assegnano le chiavi e le si mettono nello stesso ordine in ogni matrice.

Puoi anche usare array_combine .

$combinedArray = array_combine($people, $foods);
// $combinedArray = ['Tim' => 'chicken', 'Tony' => 'beef', 'Turanga' => 'slurm'];

Quindi puoi scorrere questo facendo lo stesso di prima:

foreach ($combinedArray as $person => $meal) {
    echo "$person likes $meal\n";
}

Utilizzando un indice incrementale

Questo metodo funziona incrementando un numero intero da 0 all'indice più grande dell'array.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = 0; $i < count($colors); $i++) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

Ciò consente anche di iterare una matrice in ordine inverso senza utilizzare array_reverse , il che potrebbe comportare un sovraccarico se l'array è di grandi dimensioni.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = count($colors) - 1; $i >= 0; $i--) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

È possibile saltare o riavvolgere l'indice facilmente utilizzando questo metodo.

$array = ["alpha", "beta", "gamma", "delta", "epsilon"];
for ($i = 0; $i < count($array); $i++) {
    echo $array[$i], PHP_EOL;
    if ($array[$i] === "gamma") {
        $array[$i] = "zeta";
        $i -= 2;
    } elseif ($array[$i] === "zeta") {
        $i++;
    }
}

Produzione:

alpha
beta
gamma
beta
zeta
epsilon

Per gli array che non hanno indici incrementali (compresi gli array con indici in ordine inverso, ad es. [1 => "foo", 0 => "bar"] , ["foo" => "f", "bar" => "b"] ), questo non può essere fatto direttamente. array_values o array_keys possono invece essere usati:

$array = ["a" => "alpha", "b" => "beta", "c" => "gamma", "d" => "delta"];
$keys = array_keys($array);
for ($i = 0; $i < count($array); $i++) {
    $key = $keys[$i];
    $value = $array[$key];
    echo "$value is $key\n";
}

Utilizzo di puntatori di array interni

Ogni istanza dell'array contiene un puntatore interno. Manipolando questo puntatore, è possibile recuperare diversi elementi di una matrice dalla stessa chiamata in momenti diversi.

Usando each

Ogni chiamata a each() restituisce la chiave e il valore dell'elemento di matrice corrente e incrementa il puntatore dell'array interno.

$array = ["f" => "foo", "b" => "bar"];
while (list($key, $value) = each($array)) {
    echo "$value begins with $key";
}

Usando il next

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (($value = next($array)) !== false) {
    echo "$value\n";
}

Si noti che in questo esempio non si assume che elementi della matrice siano identici a boolean false . Per evitare tale ipotesi, utilizzare la key per verificare se il puntatore interno ha raggiunto la fine dell'array:

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (key($array) !== null) {
    echo current($array) . PHP_EOL;
    next($array);
}

Ciò facilita anche l'iterazione di un array senza un ciclo diretto:

class ColorPicker {
    private $colors = ["#FF0064", "#0064FF", "#64FF00", "#FF6400", "#00FF64", "#6400FF"];
    public function nextColor() : string {
        $result = next($colors);
        // if end of array reached
        if (key($colors) === null) {
            reset($colors);
        }
        return $result;
    }
}

Usando foreach

Ciclo diretto

foreach ($colors as $color) {
    echo "I am the color $color<br>";
}

Loop con le chiavi

$foods = ['healthy' => 'Apples', 'bad' => 'Ice Cream'];
foreach ($foods as $key => $food) {
    echo "Eating $food is $key";
}

Loop per riferimento

Nei cicli foreach negli esempi precedenti, la modifica del valore ( $color o $food ) direttamente non cambia il suo valore nella matrice. L'operatore & è richiesto in modo che il valore sia un puntatore di riferimento all'elemento nell'array.

$years = [2001, 2002, 3, 4];
foreach ($years as &$year) {
    if ($year < 2000) $year += 2000;
}

Questo è simile a:

$years = [2001, 2002, 3, 4];
for($i = 0; $i < count($years); $i++) { // these two lines
    $year = &$years[$i];                // are changed to foreach by reference
    if($year < 2000) $year += 2000;
}

Concorrenza

Gli array PHP possono essere modificati in qualsiasi modo durante l'iterazione senza problemi di concorrenza (a differenza, ad esempio, di Java List ). Se l'array viene iterato per riferimento, le iterazioni successive saranno influenzate dalle modifiche all'array. In caso contrario, le modifiche all'array non influiranno sulle iterazioni successive (come se si stesse iterando invece una copia dell'array). Confronta il ciclo per valore:

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];
foreach ($array as $key => $value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

Produzione:

0 => 1
2 => 3
4 => 5
6 => 7

Ma se l'array è iterato con riferimento,

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];
foreach ($array as $key => &$value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

Produzione:

0 => 1
2 => 3
6 => 17

L'insieme di valori-chiave di 4 => 5 non viene più iterato e 6 => 7 viene modificato in 6 => 17 .

Utilizzo di ArrayObject Iterator

L'arrayiterator di Php consente di modificare e annullare l'impostazione dei valori durante l'iterazione su array e oggetti.

Esempio:

$array = ['1' => 'apple', '2' => 'banana', '3' => 'cherry'];

$arrayObject = new ArrayObject($array);

$iterator = $arrayObject->getIterator();

for($iterator; $iterator->valid(); $iterator->next()) {
    echo $iterator->key() . ' => ' . $iterator->current() . "</br>";
}

Produzione:

1 => apple
2 => banana
3 => cherry


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow