PHP注意:循环数组时未定义的索引

时间:2009-03-14 11:24:12

标签: php arrays

我正在循环这样的二维数组:

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

非常简单。如果数组($ aka)不为空,我循环通过它,当它发现“lang”索引等于“es”时,我只是在$ sptitle中保存该索引的“title”值。

问题是数组($ aka)包含大量信息,有时没有“lang”索引......我收到此错误:注意:未定义的索引: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"
    )

谢谢!

3 个答案:

答案 0 :(得分:15)

只需使用isset进行测试,例如

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

如果你不知道布尔运算符如何&&可以短路,如果第一个操作数为假,则不会评估第二个操作数。在第二个操作数中对它进行操作之前,你经常会看到这个习惯用于检查某些东西的可用性。

您也可以使用array_key_exists('lang',$ aka)而不是isset,但它的语义略有不同 - 如果元素设置为null,它将返回true,其中isset将返回false。

有趣的是,isset is at least twice as fast as array_key_exists,可能是由于它是一种语言结构而不是常规的函数调用。

答案 1 :(得分:0)

使用时会出错:

if (@$ak['lang']) 

我真的很想念我们仍然不能像1那样进行2次检查

if ($ak['lang']) 

它是关于PHP的美妙事物之一,我只是没有看到警告是否在像PHP这样的瞬态脚本语言中初始化数组键的目的。

我不确定PHP的开发人员会在哪里使用它。就个人而言,我有点担心他们会将PHP变成其他东西。只是不管它。太棒了。

答案 2 :(得分:0)

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

or


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

在大多数情况下,通过使用 @ 符号.............

注意到了这一点