Sök…


Syntax

  • för ($ i = 0; $ i <count ($ array); $ i ++) {inkremental_iteration (); }
  • för ($ i = count ($ array) - 1; $ i> = 0; $ i--) {reverse_iteration (); }
  • förhand ($ data som $ datum) {}
  • förhand ($ data som $ key => $ datum) {}
  • förhand ($ data som & $ datum) {}

Anmärkningar

Jämförelse av metoder för att upprepa en matris

Metod Fördel
foreach Den enklaste metoden för att upprepa en matris.
foreach efter referens Enkel metod för att iterera och ändra element i en matris.
for med inkrementellt index Tillåter att iterera matrisen i en fri sekvens, t.ex. hoppa över eller vända flera element
Interna matrispekare Det är inte längre nödvändigt att använda en slinga (så att den kan iterera en gång varje funktionssamtal, signalmottagning etc.)

Iterera flera matriser tillsammans

Ibland måste två matriser av samma längd itereras tillsammans, till exempel:

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

array_map är det enklaste sättet att göra detta:

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

som kommer att matas ut:

Tim likes chicken
Tony likes beef
Turanga likes slurm

Detta kan göras genom ett gemensamt index:

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

Om de två matriserna inte har inkrementella nycklar, kan array_values($array)[$i] användas för att ersätta $array[$i] .

Om båda matriserna har samma ordning med nycklar kan du också använda en förhand-med-nyckelslinga på en av matriserna:

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

Separata matriser kan endast slingas igenom om de har samma längd och också har samma nyckelnamn. Det betyder att om du inte anger en nyckel och de är numrerade kommer du att ha det bra, eller om du namnger tangenterna och lägger dem i samma ordning i varje matris.

Du kan också använda array_combine .

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

Sedan kan du gå igenom detta genom att göra samma sak som tidigare:

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

Med hjälp av ett inkrementellt index

Denna metod fungerar genom att öka ett heltal från 0 till det största indexet i arrayen.

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

Detta gör det också möjligt att upprepa en matris i omvänd ordning utan att använda array_reverse , vilket kan leda till överhead om matrisen är stor.

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

Du kan hoppa över eller spola tillbaka indexet enkelt med den här metoden.

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

Produktion:

alpha
beta
gamma
beta
zeta
epsilon

För matriser som inte har inkrementella index (inklusive matriser med index i omvänd ordning, t.ex. [1 => "foo", 0 => "bar"] , ["foo" => "f", "bar" => "b"] ), detta kan inte göras direkt. array_values eller array_keys kan användas istället:

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

Använda interna array-pekare

Varje matrisinstans innehåller en intern pekare. Genom att manipulera den här pekaren kan olika element i en matris hämtas från samma samtal vid olika tidpunkter.

Använda each

Varje samtal till each() returnerar nyckeln och värdet för det aktuella arrayelementet och ökar den interna matrispekaren.

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

Använd next

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

Observera att det här exemplet antar att inga element i matrisen är identiska med booleska false . För att förhindra ett sådant antagande använder du key att kontrollera om den interna pekaren har nått slutet på matrisen:

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

Detta underlättar också iterering av en matris utan direkt slinga:

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

Använda förhand

Direkt slinga

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

Slinga med nycklar

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

Loop genom referens

I foreach i exemplen ovan ändrar inte värdet ( $color eller $food ) direkt dess värde i matrisen. Operatören & krävs så att värdet är en referenspekare till elementet i arrayen.

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

Detta liknar:

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

samtidighet

PHP arrayer kan ändras på något sätt under iteration utan samtidighet problem (till skillnad från till exempel Java List s). Om matrisen itereras med referens kommer senare iterationer att påverkas av ändringar i matrisen. Annars påverkar inte ändringarna i arrayen senare iterationer (som om du upprepar en kopia av matrisen istället). Jämför looping efter värde:

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

Produktion:

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

Men om matrisen upprepas med referens,

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

Produktion:

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

Nyckelvärdesuppsättningen för 4 => 5 är inte längre itererad och 6 => 7 ändras till 6 => 17 .

Använda ArrayObject Iterator

Med Php arrayiterator kan du ändra och ställa in värdena medan du itererar över matriser och objekt.

Exempel:

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

Produktion:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow