3d嵌套数组foreach语句问题

时间:2017-09-05 05:42:10

标签: php arrays loops foreach

我在下面写了这个数组,我知道它不漂亮,对不起。我来到这个数组结构,因为这是我在处理我的帖子请求时唯一能想到的方法。

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

我希望能够选择" name"来自某些" 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数组中的元素数相同)。我知道如果我把密码放入代码中,那么它会解决它,但是有人知道它为什么循环两次?也许这会加深我对foreach和数组的理解。

5 个答案:

答案 0 :(得分:2)

无需第三个嵌套循环。希望这个会有所帮助。

  

问题:在第三个循环中,您正在迭代$person["id"],它有两个键。并且您只检查单个静态密钥<?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"]; } } } ,这就是它打印两次的原因。

解决方案1:

Try this code snippet here

 echo array_column($POSTData["person"],"name","id")[1];//here 1 is the `id` you want.

解决方案2:

或者,您可以尝试这种单线解决方案。

Try this code snippet here

 <?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;
         }
       }
   }

   ?>

答案 1 :(得分:2)

不需要第三个foreach

SimpleDateFormat

现场演示:https://eval.in/855386

答案 2 :(得分:2)

你必须看到其他答案,他们已经说过你不需要第3次循环。但仍然如果你想保持第三个循环。 你可以使用这段代码。

foreach ($_POST as $dataSet) {

    foreach ($dataSet as $person) {

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

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

        }

    }

}

答案 3 :(得分:2)

虽然目前还不清楚为什么你需要以这种方式进行POST,但这里有如何获得&#34; bob&#34;只有一次:

<?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条件求值为true时,只发生一次,然后名称&#34; bob&#34;显示器。

请参阅live code

或者,您可以使用以下几个循环:

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

请参阅demo

答案 4 :(得分:1)

正如你所提到的,我希望能够从某个id中选择名称,:不需要嵌套循环。您可以使用array_columnarray_search

执行此操作
$data = array("person" => array(
        1 => array("id" => 1, "name" => "bob"),
        2 => array("id" => 2, "name" => "jim")
    )
);

// 1 is id you want to search for
$key = array_search(1, array_column($data['person'], 'id'));
echo $data['person'][$key + 1]['name']; // $key + 1 as you have started array with 1

输出:

bob

与foreach:

foreach ($data as $dataValue) {
    foreach ($dataValue as $person) {
        if ($person['id'] === 1) {
            echo $person["name"];
        }
    }
}