2017-09-05 10 views
2

私はこの配列を以下に書いてあり、それはかなり、残念ではないことを私は知っています。私はこの配列構造に来るのは、私の投稿要求に対処するときに考えられる唯一の方法です。3dネストされた配列foreachステートメントの問題

特定の「id」から「名前」を選択できるようにしたいので、以下のコードは私が思いついたものです。以下の例では、person ["id"]が1の場合、 "bob"という "name"を取得します。

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

問題は私がコードを実行することです。 結果はbobbob

です。コードがif文を2回繰り返したようです(person配列の要素数と同じです)。私はコードに侵入すれば解決するだろうが、誰もが2回ループした理由を知っている?多分私のforeachと配列の理解を深めるでしょう。

+0

を参照してくださいだけのvar_dump($者) ''に試してみて、あなたの 'if' :) –

+2

可能な重複を見て[値によるPHP多次元配列検索](https://stackoverflow.com/questions/6661530/php-multidimensional-array-search-by-value) – mickmackusa

答えて

2

第3ネストループを持つ必要はありません。これが役に立つと願っています。

問題:あなたは2つのキーを持っているPersons: array("id" => 1, "name" => "bob")を反復し、第3のループで。単一の静的キー$person["id"]だけをチェックしているので、2回印刷しています。

解決方法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

あなたは他の回答を見ている必要があります、そして、彼らはすでにあなたが必要といけないと言っています第3ループ。まだ3番目のループを維持したい場合は、 このコードを使用できます。

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 

出力:

のforeachと

bob

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" 
    } 
} 

回のみ、名前を発生真などの場合条件評価します「ボブ」が表示されます。

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

関連する問題