За последние 24 часа нас посетили 22550 программистов и 1143 робота. Сейчас ищут 659 программистов ...

Как перебрать многомерный массив $_POST

Тема в разделе "Сделайте за меня", создана пользователем roman_php, 20 окт 2022.

  1. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Доброго времени суток!
    Очень прошу показать "на пальцах" ну или как получится, можно просто решением, буду додумывать сам :)

    Из некой формы посредством POST приходит некий многомерный массив, print_r выдает такую структуру массива:
    Код (Text):
    1. Array
    2. (
    3.     [adres] => город
    4.     [shema] => ДДА
    5.     [0] => Array
    6.         (
    7.             [nomer_r_doc] => 4.1
    8.             [vib_r_doc] => risk_doc
    9.             [text_r_doc] => 1
    10.             [nomer_r_dog] => 5.1
    11.             [vib_r_dog] => risk_dog
    12.             [text_r_dog] => 3
    13.         )
    14.  
    15.     [1] => Array
    16.         (
    17.             [nomer_r_doc] => 4.2
    18.             [vib_r_doc] => min_doc
    19.             [text_r_doc] => 2
    20.         )
    21.  
    22.     [send] => Отправить
    23. )
    Пытаюсь перебрать каждое значение ключ -> значение

    Код (Text):
    1. <?php
    2. if (!empty($_POST)){
    3.     $i = 1;
    4.         foreach ($_POST as $key => $value) {
    5.             if (gettype($key) === "integer"){
    6.                 echo '<strong>№' . $i++ . '</strong></br>' . "\n";
    7.                         echo 'Вывод ключа nomer_r_doc: ' . $value['nomer_r_doc'] . ' </br>' . "\n";
    8.                         echo 'Вывод ключа vib_r_doc: ' . $value['vib_r_doc'] . '</br>'  . "\n";
    9.                         echo 'Вывод ключа text_r_doc: ' . $value['text_r_doc'] . '</br>' . "\n";
    10.                         echo 'Вывод ключа nomer_r_dog: ' . $value['nomer_r_dog'] . '</br>' . "\n";
    11.                         echo 'Вывод ключа vib_r_dog: ' . $value['vib_r_dog'] . '</br>' . "\n";
    12.                         echo 'Вывод ключа text_r_dog: ' . $value['text_r_dog'] . '</br>' . "\n";
    13.                         echo 'Вывод ключа adres: ' . $value['adres'] . '</br>' . "\n";
    14.             }
    15.         }
    16. }
    17. ?>
    В итоге получаю следующее

    №1
    Вывод ключа nomer_r_doc: 4.1
    Вывод ключа vib_r_doc: risk_doc
    Вывод ключа text_r_doc: 1
    Вывод ключа nomer_r_dog: 5.1
    Вывод ключа vib_r_dog: risk_dog
    Вывод ключа text_r_dog: 3

    Warning: Undefined array key "adres" in F:\server\OpenServer\domains\uz\result_uz.php on line 20
    Вывод ключа adres:
    №2
    Вывод ключа nomer_r_doc: 4.2
    Вывод ключа vib_r_doc: min_doc
    Вывод ключа text_r_doc: 2

    Warning: Undefined array key "nomer_r_dog" in F:\server\OpenServer\domains\uz\result_uz.php on line 17
    Вывод ключа nomer_r_dog:

    Warning: Undefined array key "vib_r_dog" in F:\server\OpenServer\domains\uz\result_uz.php on line 18
    Вывод ключа vib_r_dog:

    Warning: Undefined array key "text_r_dog" in F:\server\OpenServer\domains\uz\result_uz.php on line 19
    Вывод ключа text_r_dog:

    Warning: Undefined array key "adres" in F:\server\OpenServer\domains\uz\result_uz.php on line 20
    Вывод ключа adres:

    Т.е. получается, что первый вложенный массив foreach нормально отрабатывает, а дальше выдает ошибки, Warning: Undefined array key.

    Понимаю, что вопрос нубский (я им и являюсь) и в гугле меня не за банили, но вот, что то не нахожу, как перебрать все значения в массиве $_POST.
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это, само по себе, должно было натолкнуть на мысль, что так не делают. Нет?
    Извлекайте только то, что ожидаете. Как вариант, можно посчитать общее количество элементов, и если их не столько, сколько должно прийти, то вообще ничего не трогайте.
    Например
    Код (Text):
    1.  
    2. $var = 'default value';
    3.  
    4. if(isset($_POST['keyname']) && my_function($_POST['keyname']) == 'value')
    5. {
    6.    $var = $_POST['keyname'];
    7. }
     
  3. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Доброго времени суток. Я понимаю, что вы хотите сказать, что нужно извлекать только нужные значения, но задача именно извлечь все значения.
    На другом форуме мне уже подсказали решение и оно работает так как надо:
    Код (Text):
    1. foreach ($_POST as $key => $value) {
    2.     if(is_array($value))
    3.     {
    4.         foreach ($value as $key_2 => $value_2) {
    5.             echo $key_2. '=>'.$value_2."<br />";
    6.         }
    7.     }
    8.    else echo $key. '=>'.$value."<br />";
    9. }
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не совсем.
    В вашем массиве два уровня. Если их будет больше, то работать оно не будет.
     
  5. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Действительно, согласен с вами, если будет 3 уровня в массиве, уже не сработает. Неужели в php нет возможности отработать массив сколько угодно вложенности друг в друга и при этом если не известно сколько уровней в нем, должно же быть что-то, как то такая задача должна решаться?!
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
  7. snakenest

    snakenest Новичок

    С нами с:
    1 дек 2022
    Сообщения:
    12
    Симпатии:
    1
    Все просто!
    Делаем функцию

    PHP:
    1.    function ReadField(&$Src,$Name,$Default='')
    2.     {
    3.         if ((array_key_exists($Name,$Src)))
    4.         {
    5.             return (is_string($Src[$Name])? trim($Src[$Name]) : $Src[$Name]);
    6.         }
    7.         foreach($Src as $Element)
    8.         {
    9.             if (is_array($Element))
    10.             {
    11.                 $Value = ReadField($Element,$Name,$Default);
    12.                 if ($Value!==$Default) return $Value;
    13.             }
    14.         }
    15.         return $Default;
    16.     }
    И наслаждаемся:
    PHP:
    1. echo 'Вывод ключа nomer_r_doc: '  . ReadField($_POST,'nomer_r_doc','undefined'). ' </br>' . "\n";
    2.       echo 'Вывод ключа vib_r_doc: '    . ReadField($_POST,'vib_r_doc','undefined') . '</br>'  . "\n";
    3.       echo 'Вывод ключа text_r_doc: '   . ReadField($_POST,'text_r_doc','undefined') . '</br>' . "\n";
    4.       echo 'Вывод ключа nomer_r_dog: '  . ReadField($_POST,'nomer_r_dog','undefined') . '</br>' . "\n";
    5.       echo 'Вывод ключа vib_r_dog: '    . ReadField($_POST,'vib_r_dog','undefined') . '</br>' . "\n";
    6.       echo 'Вывод ключа text_r_dog: '   . ReadField($_POST,'text_r_dog','undefined') . '</br>' . "\n";
    7.       echo 'Вывод ключа adres: '        . ReadField($_POST,'adres','undefined') . '</br>' . "\n";

    вывод, будет такой, если взять пример указанный в вопросе

    HTML:
    1. Вывод ключа nomer_r_doc: 4.1
    2. Вывод ключа vib_r_doc: risk_doc
    3. Вывод ключа text_r_doc: 1
    4. Вывод ключа nomer_r_dog: 5.1
    5. Вывод ключа vib_r_dog: risk_dog
    6. Вывод ключа text_r_dog: 3
    7. Вывод ключа adres: город