2009-03-14 6 views
6
私はこのような2次元配列をループしています:

PHPの注意:配列をループするときの未定義のインデックス

if (!empty($aka)) { 
    foreach ($aka as $ak) { 
     if($ak["lang"]=="es") { 
      $sptitle=$ak["title"]; 
     } 
    } 
} 

かなり簡単です。配列($ aka)が空でない場合は、それをループし、 "lang"インデックスが "es"に等しいことがわかったら、そのインデックスの "title"値を$ sptitleに保存するだけです。

問題は、配列($ aka)には多くの情報が含まれていることがあり、時には "lang"インデックスが存在しないことです...このエラーが発生します:Notice:未定義インデックス:lang。

どうすればこの問題を解決できますか?

これは、理解に役立つ配列の抽出です。 [1]には[lang]インデックスはありませんが、[2]には次のようなものがあります。

[1] => Array 
    (
     [title] => "The Lord of the Rings: The Motion Picture" 
     [year] => "" 
     [country] => "USA" 
     [comment] => "promotional title" 
    ) 

[2] => Array 
    (
     [title] => "Señor de los anillos: La comunidad del anillo, El" 
     [year] => "" 
     [country] => "Argentina" 
     [comment] => "Chile, Mexico, Peru, Spain" 
     [lang] => "es" 
    ) 

ありがとう!

答えて

15

issetでテストしてください。

if (!empty($aka)) { 
     foreach ($aka as $ak) { 
       if(isset($ak["lang"]) && ($ak["lang"]=="es")) { 
         $sptitle=$ak["title"]; 
       } 
     } 
} 

あなたは& &のようなブール演算子が短絡することができる方法を知らないなら、最初のオペランドがfalseの場合は、2番目のオペランドは評価されません。第2のオペランドでそれを実行する前に、何かの可用性をチェックするのに使用されるこのイディオムがよく見られます。

あなたはまた、代わりにISSETのarray_key_exists(「LANG」、$の別名)を使用することができ、それはしかし、わずかに異なる意味を持っている - 要素がnullに設定されている場合には、whereisはのISSETはfalseを返します、trueを返します。

興味深いことに、isset is at least twice as fast as array_key_existsです。これは、おそらく通常の関数呼び出しではなく言語構造であるためです。

+1

を用いて除去気づいたが、それは(驚くほど)Aのために使用することは、具体的ISSETすごく速いhttp://us.php.net/manual/en/function.array-key-exists.php#82867 – enobrev

+0

ええと、isset($ ak ['lang'])は未定義のインデックスのE_NOTICEを引き上げます。 array_key_exists()はできません。 – cletus

+4

issetは通知を出しません。試してみてください。 –

0

使用することを間違っているだろう:

if (@$ak['lang']) 

は、私は本当にそれが美しいの一つであったので、

if ($ak['lang']) 

我々はまだのような1で2つのチェックを行うことができないという事実を欠場しますPHPに関することですが、PHPのような一時的なスクリプト言語で配列キーが初期化されるかどうかを警告する目的はありません。

私は、PHPの開発者がこれをどうやって行っているのか分かりません。個人的に、私は彼らが何かにPHPをモーフィングしていることを少し心配しています。ちょうどそれを残す。よかった。ほとんどの場合、

+0

[このページ](http://php.net/manual/en/errorfunc.configuration.php)のマニュアルの状態: "PHP 4とPHP 5では、デフォルト値はE_ALL&〜E_NOTICEです。この設定は表示されませんE_NOTICEレベルのエラー。"このE_NOTICEの表示は設定上の問題であり、PHPの問題ではありません。 – Unsigned

0
if (@!empty($aka)) { 
     foreach ($aka as $ak) { 
       if($ak["lang"]=="es") { 
         $sptitle=$ak["title"]; 
       } 
     } 
} 

or 


if (@$_POST['value'] == 'yes') 
{ 
    state; 
} 

これは私が個人的にarray_key_existsを好む @記号.............

関連する問題