簡體   English   中英

3d嵌套數組foreach語句問題

[英]3d nested array foreach statement issue

我在下面寫了這個數組,我知道它不漂亮,對不起。 我來到這個數組結構,因為這是我在處理我的帖子請求時唯一能想到的方法。

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

我希望能夠從某些“id”中選擇“name”,所以下面的代碼是我想出的。 在下面的示例中,如果person [“id”]等於1,則檢索其“名稱”,即“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和數組的理解。

不需要第三個嵌套循環 希望這個會有所幫助。

問題:在第三個循環中,你迭代了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.

不需要第三個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'];
            }

        }

    }

}

雖然目前還不清楚為什么你需要以這種方式進行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條件求值為true時,僅出現一次,則顯示名稱“bob”。

查看實時代碼

或者,您可以使用以下幾個循環:

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

演示

正如您所提到的, 我希望能夠從某個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"];
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM