У меня есть этот массив, написанный ниже, и я знаю, что это не красиво, извините. Я пришел к этой структуре массива, так как это единственный способ, который я мог придумать, имея дело с моим пост-запросом.

$_POST = array("person" => array(
                                 [1] => array("id" => 1, "name" => "bob"), 
                                 [2] => array("id" => 2, "name" => "jim")
                                )
               );

Я хочу иметь возможность выбирать «имя» из определенного «id», поэтому нижеприведенный код - это то, что я придумал. В приведенном ниже примере, если person ["id"] равен 1, получить его "name", которое равно "bob".

foreach ($_POST as $dataSet) {
    foreach ($dataSet as $person) {
        foreach ($person as $field => $value) {
            if ($person["id"] == 1) {
                echo $person["name"];
            }
        }
    }
}

Проблема у меня заключается в том, как я выполняю код. результат bobbob,

Похоже, что код дважды зацикливал оператор if (то же самое, что и количество элементов в массиве person). Я знаю, если я вставлю код в разрыв, то это решит его, но кто-нибудь знает, почему он повторяется дважды? Может быть, это углубит мои знания и понимание.

2
Salam.MSaif 5 Сен 2017 в 08:42

4 ответа

Лучший ответ

Нет необходимости иметь третий вложенный цикл . Надеюсь, что это будет полезно.

Проблема: В третьем цикле вы перебирали Persons: array("id" => 1, "name" => "bob"), у которого есть два ключа. и вы проверяете только один статический ключ $person["id"], поэтому он печатал дважды.

Решение 1:

Попробуйте этот фрагмент кода здесь

<?php

ini_set('display_errors', 1);

$POSTData = array("person" => array(
        1 => array("id" => 1, "name" => "bob"),
        2 => array("id" => 2, "name" => "jim")
    )
);
foreach ($POSTData as $dataSet)
{
    foreach ($dataSet as $person)
    {
        if ($person["id"] == 1)
        {
            echo $person["name"];
        }
    }
}

Решение 2:

В качестве альтернативы вы можете попробовать это однострочное решение.

Попробуйте этот фрагмент кода здесь

 echo array_column($POSTData["person"],"name","id")[1];//here 1 is the `id` you want.
2
Sahil Gulati 5 Сен 2017 в 06:04

Вы, наверное, видели другие ответы, и они уже сказали, что вам не нужен третий цикл . но все же, если вы хотите сохранить третий цикл. Вы можете использовать этот код.

foreach ($_POST as $dataSet) {

    foreach ($dataSet as $person) {

        foreach ($person as $field => $value) {

            if($value == 1){
                echo $person['name'];
            }

        }

    }

}
2
Punit Gajjar 5 Сен 2017 в 06:04

Нет необходимости третьего foreach

 <?php
   $mainArr = array("person" => array(
                        1 => array("id" => 1, "name" => "bob"), 
                        2 => array("id" => 2, "name" => "jim")
                           )
                   );
   foreach ($mainArr as $dataSet) {
       foreach ($dataSet as $person) {
         if ($person["id"] == 1) {
             echo $person["name"];
             break;
         }
       }
   }

   ?>

Демонстрационная версия: https://eval.in/855386

2
Niklesh Raut 5 Сен 2017 в 07:56

Хотя неясно, зачем вам нужно делать POST таким способом, вот как получить «bob» только один раз:

<?php

$_POST = array("person" => array(
                                 1 => array("id" => 1, "name" => "bob"), 
                                 2 => array("id" => 2, "name" => "jim")
                                )
               );



$arr = array_pop($_POST);

foreach($arr as $a) {
  if ($a["id"] == 1) {
    echo $a["name"];
  }
}

Array_pop () полезен для удаления первого элемента массива, значением которого является сам массив, который выглядит следующим образом:

array(2) {
  [1]=>
  array(2) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(3) "bob"
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(3) "jim"
  }
}

Когда условное условие if оценивается как истинное, что встречается только один раз, отображается имя «bob».

Смотрите живой код.

В качестве альтернативы, вы можете использовать несколько циклов следующим образом:

foreach ($_POST["person"] as $data) {
    foreach ($data as $value) {
        if ( $value == 1) {
            echo $data["name"],"\n";
        }
    }
}

См. демонстрационную версию.

2
slevy1 5 Сен 2017 в 09:02