PHP通知:循环数组时未定义索引

7
我将翻译如下内容:

我正在遍历一个二维数组,类似于这样:

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

很简单。如果数组($aka)不为空,我会遍历它,并且当找到“lang”索引等于“es”时,我只会将该索引的“title”值保存在$sptitle中。
问题是数组($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个回答

16

可以使用isset来进行测试,例如:

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

如果你不知道像 && 这样的布尔运算符可以被短路,那么当第一个操作数为 false 时,第二个操作数将不会被计算。在第二个操作数上采取行动之前,在检查某些东西是否可用时,您经常会看到这种用法。

你还可以使用 array_key_exists('lang', $aka) 代替 isset,虽然它的语义略有不同 - 如果元素设置为 null,则它将返回 true,而 isset 将返回 false。

有趣的是,isset 的速度至少是 array_key_exists 的两倍,可能是由于它是一种语言结构而不是普通函数调用。


1
我个人更喜欢使用 array_key_exists,但是由于 isset 效率非常高(出乎意料),所以我会专门使用它。http://us.php.net/manual/en/function.array-key-exists.php#82867 - enobrev
嗯,isset($ak['lang']) 仍会引发未定义索引的 E_NOTICE。而 array_key_exists() 则不会。 - cletus
4
isset不会引发通知错误,可以尝试使用。 - Paul Dixon

0

使用这个会有问题吗:

if (@$ak['lang']) 

我真的很想念我们仍然不能像这样一次完成两个检查的事实

if ($ak['lang']) 

PHP 的一个美好之处就在于这一点,我不明白在像 PHP 这样的瞬态脚本语言中警告数组键是否初始化的目的何在。

我不确定 PHP 的开发人员将 PHP 发展成什么样子。个人而言,我有些担心他们正在将 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;
 }

在大多数情况下,可以使用 @ 符号来删除此通知。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接