Iteracja nad złożoną tablicą asocjacyjną w PHP

Czy istnieje łatwy sposób na iterację tablicy asocjacyjnej tej struktury w PHP:

Tablica $searches mA numerowany indeks, zawierający od 4 do 5 części asocjacyjnych. Więc nie tylko muszę powtarzać $searches[0] przez $searches[n], ale także $searches[0]["part0"] przez $searches[n]["partn"]. Trudniejsze jest to, że różne indeksy mają różną liczbę części (niektóre mogą brakować jednego lub dwóch).

Myślisz o zrobieniu tego w sposób miły, schludny i zrozumiały?
Author: Jason Plank, 2008-08-25

7 answers

Gniazdo dwa foreach pętle :

foreach ($array as $i => $values) {
    print "$i {\n";
    foreach ($values as $key => $value) {
        print "    $key => $value\n";
    }
    print "}\n";
}
 39
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 17:03:02

Wiem, że to kwestia nekromancji, ale iteracja nad tablicami wielowymiarowymi jest łatwa dzięki Iteratorom Spl

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));

foreach($iterator as $key=>$value) {
    echo $key.' -- '.$value.'<br />';
}

Zobacz

 39
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-05 14:38:57

Wygląda na dobre miejsce dla funkcji rekurencyjnej, esp. jeśli będziesz miał więcej niż dwa poziomy głębokości.

function doSomething(&$complex_array)
{
    foreach ($complex_array as $n => $v)
    {
        if (is_array($v))
            doSomething($v);
        else
            do whatever you want to do with a single node
    }
}
 13
Author: Milan Babuškov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 07:22:10

Powinieneś być w stanie użyć zagnieżdżonego znacznika foreach

Z podręcznika php

/* foreach example 4: multi-dimensional arrays */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach ($a as $v1) {
    foreach ($v1 as $v2) {
        echo "$v2\n";
    }
}
 5
Author: Re0sless,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-25 13:21:48

Czy możesz po prostu zapętlić wszystkie elementy "part[n]" i użyć isset, aby sprawdzić, czy rzeczywiście istnieją, czy nie?

 0
Author: Mark Biek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-25 13:21:51

Naprawdę nie jestem pewien, co masz na myśli tutaj-na pewno para pętli foreach robi to, czego potrzebujesz?

foreach($array as $id => $assoc)
{
    foreach($assoc as $part => $data)
    {
        // code
    }
}

A może potrzebujesz czegoś rekurencyjnego? Byłbym w stanie pomóc Więcej z przykładowych danych i kontekstu w jaki sposób chcesz dane zwracane.

 0
Author: Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-25 13:26:53

Rozważmy tę tablicę wielomianową, mam nadzieję, że ta funkcja pomoże.

$n = array('customer' => array('address' => 'Kenmore street',
                'phone' => '121223'),
      'consumer' => 'wellington consumer',
      'employee' => array('name' => array('fname' => 'finau', 'lname' => 'kaufusi'),
                     'age' => 32,
                 'nationality' => 'Tonga')
      );



iterator($n);

function iterator($arr){

    foreach($arr as $key => $val){

    if(is_array($val))iterator($val);

    echo '<p>key: '.$key.' | value: '.$val.'</p>';

    //filter the $key and $val here and do what you want
    }

}
 0
Author: fkaufusi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-05 22:51:33