2017-09-05 79 views
2

我有這個陣列下面寫的,我知道這很心不是,對不起。我來到這個數組結構,因爲它是處理我的請求時唯一可以想到的方式。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

回答

2

沒有必要有第三嵌套循環。希望這個會有幫助。

問題:在你遍歷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. 
2

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

你一定見過其他的答案,他們已經表示,你不需要第三回路。但仍然如果你想保持第三個循環。 您可以使用此代碼。

foreach ($_POST as $dataSet) { 

    foreach ($dataSet as $person) { 

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

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

     } 

    } 

} 
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"]; 
     } 
    } 
} 
2

雖然目前還不清楚爲什麼你需要做這一個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