Mějme pole s několika úrovněmi:

$array = [
    'a' => [
        'aa' => 10,
        'ab' => 250,
        'ac' => 100,
    ],
    'b' => [
        'ba' => 20,
        'bb' => [
            'bba' => 20,
            'bbb' => 20,
            'bbc' => 20,
        ],
        'bc' => 10,
    ],
];

Máme za úkol vypsat všechny klíče a jejich hodnoty. Samozřejmě bychom mohli použít neprimitivnější postup a použít foreach nad polem. V něm bychom testovali, jestli je aktuálně procházený prvek také pole. Pokud ano, pak bychom jej procházeli a vypisovali jeho klíče a hodnoty. Pokud ne, jen vypíšeme jeho klíč a hodnotu.

To se ale dá použít jen tehdy, když přesně víme kolik úrovní zanoření máme. Navíc to není moc pěkný kód a bude zmatek v proměnných:

foreach ($array as $key => $val) {
    if(is_array($val)) {
        foreach ($val as $key2 => $val2) {
            if(is_array($val2)) {
                foreach ($val2 as $key3 => $val3) {
                    echo $key3 . ":" . $val3 . "<br>";
                }
            } else {
                echo $key2 . ":" . $val2 . "<br>";
            }
        }
    } else {
        echo $key . ":" . $val . "<br>";
    }
}

Trochu lepší je použití rekurzivně volané funkce. Tam je nám jedno kolik úrovní vnoření existuje. Funkce může vypadat třeba takto:

function printAllVals($key, $val) {
    if (!is_array($val)) {
        echo $key . ":" . $val . "<br>";
        return;
    }

    foreach($val as $key2 => $val2) {
            $this->printAllVals($key2, $val2);
    }
}

printAllVals([], $array);

Při prvním volání funkce předávám jako parametr prázdné pole. Jak říkám – je to už univerzálněji použitelné, ale jaksi to pořád ještě není ono. To pravé je použít vestavěné funkce pro práci s kolekcemi přímo v PHP:

$iterArray = new \RecursiveIteratorIterator( new \RecursiveArrayIterator($array));
foreach ($iterArray as $key => $val) {
    echo $key . ":" . $val . "<br>";
}

Je to čisté a krásné, funguje to bezvadně a nic nám v kódu nepřekáží.

Procházení multidimenzionálního pole
Zatím nehlasováno.
Please wait...

Napsat komentář