PHP foreach with multidimensional array

Rozwijam aplikację php, która używa klasy bazy danych do odpytywania mySQL.

Klasa jest tutaj: http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/

Zrobiłem kilka poprawek na klasie, aby dopasować się do moich potrzeb, ale jest problem (może głupi)

Podczas używania select () zwraca wielowymiarową tablicę, taką jak ta dla tabeli, która ma 3 cols (id, firstname, lastname):

Array
(
    [0] => Array
        (
            [id] => 1
            [firstname] => Firstname one
            [lastname] => Lastname one
        )

    [1] => Array
        (
            [id] => 2
            [firstname] => Firstname two
            [lastname] => Lastname two
        )

    [2] => Array
        (
            [id] => 3
            [firstname] => Firstname three
            [lastname] => Lastname three
        )
)

Teraz chcę, aby ta tablica była używana jako wynik mysql (mysql_fetch_assoc).

Wiem, że może być używana z foreach (), ale jest to z prostymi tablicami. więc myślę, że muszę ponownie zgłosić nową foreach () z każdym foreach (), ale myślę, że to może spowolnić lub spowodować większe obciążenie serwera.

Więc jak zastosować foreach() z tą wielowymiarową tablicą w najprostszy sposób?

Thanks

Author: bpeterson76, 2011-06-20

11 answers

Możesz użyć foreach tutaj dobrze.

foreach ($rows as $row) {
    echo $row['id'];
    echo $row['firstname'];
    echo $row['lastname'];
}

Myślę, że jesteś przyzwyczajony do uzyskiwania dostępu do danych za pomocą wskaźników numerycznych (takich jak $row[0]), ale nie jest to konieczne. Możemy użyć tablic asocjacyjnych, aby uzyskać dane, których szukamy.

 92
Author: Brad,
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
2011-06-20 15:29:46

Możesz użyć array_walk_recursive:

array_walk_recursive($array, function ($item, $key) {
    echo "$key holds $item\n";
});
 12
Author: Karolis,
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
2011-06-20 15:38:51

To byłby komentarz pod odpowiedzią Brada, ale nie mam wystarczająco wysokiej reputacji.

Ostatnio odkryłem, że potrzebuję klucza tablicy wielowymiarowej, tzn. nie był to tylko indeks tablicy, w pętli foreach.

Aby to osiągnąć, możesz użyć czegoś bardzo podobnego do zaakceptowanej odpowiedzi, ale zamiast tego podziel klucz i wartość w następujący sposób

foreach ($mda as $mdaKey => $mdaData) {
    echo $mdaKey . ": " . $mdaData["value"];
}
Mam nadzieję, że to komuś pomoże.
 3
Author: arvy3,
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
2014-11-06 01:12:09

Przykład z mysql_fetch_assoc():

while ($row = mysql_fetch_assoc($result))
{
    /* ... your stuff ...*/
}

W Twoim przypadku z foreach, za pomocą tablicy $result otrzymujesz z select():

foreach ($result as $row)
{
    /* ... your stuff ...*/
}

Jest tak samo, z odpowiednią iteracją.

 2
Author: aorcsik,
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
2011-06-20 15:29:52

W przypadku tablic w php pętla foreach jest zawsze ładnym rozwiązaniem.
W tym przypadku może to być na przykład:

foreach($my_array as $number => $number_array)
    {
    foreach($number_array as $data = > $user_data)
        {
            print "Array number: $number, contains $data with $user_data.  <br>";
        }
    }
 2
Author: nao_de_naoned,
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
2015-03-31 08:07:43

Holla / Hello , Mam! Możesz łatwo uzyskać nazwę pliku, tmp_name, file_size etc.So pokażę Ci, jak uzyskać nazwę pliku z linią kodu.

for ($i = 0 ; $i < count($files['name']); $i++) {
    echo $files['name'][$i].'<br/>';
}

Jest testowany na moim komputerze.

 2
Author: Asraful Haque,
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-06-20 12:05:26

Idealnie wielowymiarowa tablica jest zwykle tablicą tablic, więc pomyślałem, że zadeklaruję pustą tablicę, a następnie utwórz pary klucz i wartość z wyniku db w oddzielną tablicę, wreszcie wypchnij każdą tablicę utworzoną podczas iteracji do zewnętrznej tablicy. możesz zwrócić zewnętrzną tablicę w przypadku, gdy jest to osobne wywołanie funkcji. Hope that helps

$response = array();    
foreach ($res as $result) {
        $elements = array("firstname" => $result[0], "subject_name" => $result[1]);
        array_push($response, $elements);
    }
 1
Author: Poly,
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
2015-02-20 08:01:55

Wiem, że to dość stara odpowiedź. Oto szybsze rozwiązanie bez użycia foreach:

Użyj array_column

print_r(array_column($array, 'firstname')); #returns the value associated with that key 'firstname'

Możesz również sprawdzić przed wykonaniem powyższej operacji

if(array_key_exists('firstname', $array)){
   print_r(array_column($array, 'firstname'));
}
 1
Author: Akintunde-Rotimi,
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-05-15 08:25:30

Czy normalny foreach nie da takiego samego wyniku jak mysql_fetch_assoc w Twoim przypadku?

Gdy używasz foreach na tej tablicy, otrzymujesz tablicę zawierającą te trzy klucze: 'id', 'firstname ' i'lastname'.

To powinno być to samo, co mysql_fetch_assoc dałoby (w pętli) dla każdego wiersza.

 0
Author: Yhn,
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
2011-06-20 15:28:34
foreach ($parsed as $key=> $poke)
{
    $insert = mysql_query("insert into soal 
                          (pertanyaan, a, b, c, d, e, jawaban)
                          values
                          ('$poke[question]',
                          '$poke[options][A]',
                          '$poke[options][B]',
                          '$poke[options][C]',
                          '$poke[options][D]',
                          '$poke[options][E]',
                          '$poke[answer]')");
}
 0
Author: endip,
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-12-03 04:06:10

Uzyskanie szczegółów z każdej wartości w wielowymiarowej tablicy jest dość proste, gdy masz tablicę na miejscu. Więc to jest Tablica:

$example_array = array(
array('1','John','Smith'),
array('2','Dave','Jones'),
array('3','Bob','Williams')
);

Następnie użyj pętli foreach i przeprowadź tablicę Tak:

foreach ($example_array as $value) {
echo $value[0]; //this will echo 1 on first cycle, 2 on second etc....
echo $value[1]; //this will echo John on first cycle, Dave on second etc....
echo $value[2]; //this will echo Smith on first cycle, Jones on second etc....
}

Możesz echo co chcesz wokół niego, więc echo do Tabeli:

echo "<table>"
    foreach ($example_array as $value) {
    echo "<tr><td>" . $value[0] . "</td>";
    echo "<td>" . $value[1] . "</td>";
    echo "<td>" . $value[2] . "</td></tr>";
    }
echo "</table>";

Powinno dać ci taką tabelę:

|1|John|Smith   |
|2|Dave|Jones   |
|3|Bob |Williams|
 0
Author: Rmj86,
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-06-12 17:20:37