3D嵌套数组foreach语句问题

问题描述:

我有这个阵列下面写的,我知道这很心不是,对不起。我来到这个数组结构,因为它是处理我的请求时唯一可以想到的方式。3D嵌套数组foreach语句问题

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

我希望能够从某个“id”中选择“名称”,所以下面的代码就是我想出来的。在下面的例子中,如果人[“ID”]等于1,检索其“名称”,这是“鲍勃”。

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

我遇到的问题是我执行代码。 结果是bobbob,

似乎代码循环if语句两次(与人数组中的元素数相同)。我知道,如果我把破入代码,那么它会解决这个问题,但任何人都知道为什么两次循环?也许这会加深我的习惯和阵容的理解。

+0

刚刚尝试'的var_dump($人)',看看你的'if' :) –

+2

可能的复制[多维数组搜索的价值](https://stackoverflow.com/questions/6661530/php-multidimensional-array-search-by-value) – mickmackusa

没有必要有第三嵌套循环。希望这个会有帮助。

问题:在你遍历Persons: array("id" => 1, "name" => "bob")其中有两个关键的第三环。和你正在检查仅单个静态密钥$person["id"],这就是为什么它被打印两次。

解决方案1:

Try this code snippet here

<?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:

或者你可以试试这个单行方案。

Try this code snippet here

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

无需第三方的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

你一定见过其他的答案,他们已经表示,你不需要第三回路。但仍然如果你想保持第三个循环。 您可以使用此代码。

foreach ($_POST as $dataSet) { 

    foreach ($dataSet as $person) { 

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

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

     } 

    } 

} 

至于你提到的我希望能够从某些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"]; 
     } 
    } 
} 

虽然目前还不清楚为什么你需要做这一个POST时尚,这里是如何获得“鲍勃”只有一次:

<?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”显示。

参见live code

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

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

demo

+1

它是array_pop或array_shift? –

+0

@ Salam.MSaif array_pop;查看实时代码:https://3v4l.org/QocDU#output – slevy1