【问题标题】:PHP Notice: Undefined index when looping arrayPHP 注意:循环数组时未定义索引
【发布时间】:2009-03-14 11:24:11
【问题描述】:

我正在像这样循环一个二维数组:

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

很简单。如果数组($aka)不是空的,我会遍历它,当它发现“lang”索引等于“es”时,我只需将该索引的“title”值保存在 $sptitle 中。

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

谢谢!

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    只需使用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,可能是因为它是一种语言构造而不是常规函数调用。

    【讨论】:

    • 我个人更喜欢 array_key_exists,但特别使用 isset,因为它(令人惊讶)快了很多 us.php.net/manual/en/function.array-key-exists.php#82867
    • 嗯,isset($ak['lang']) 仍然会引发未定义索引的 E_NOTICE。 array_key_exists() 不会。
    • isset 不会发出通知,试试吧。
    【解决方案2】:

    使用会不会出错:

    if (@$ak['lang']) 
    

    我真的很怀念我们仍然不能像这样在 1 中进行 2 次检查

    if ($ak['lang']) 
    

    这是 PHP 的一大优点,我只是看不到警告数组键是否在像 PHP 这样的临时脚本语言中初始化的目的。

    我不确定 PHP 的开发人员将如何处理这个问题。就个人而言,我有点担心他们正在把 PHP 变成别的东西。别管它。太好了。

    【讨论】:

    • this page 上的手册指出:“在 PHP 4 和 PHP 5 中,默认值为 E_ALL & ~E_NOTICE。此设置不显示 E_NOTICE 级别错误。”这个 E_NOTICE 的显示是配置问题,不是 PHP 问题。
    【解决方案3】:
    if (@!empty($aka)) {
            foreach ($aka as $ak) {
                    if($ak["lang"]=="es") {
                            $sptitle=$ak["title"];
                    }
            }
    }
    
    or
    
    
    if ( @$_POST['value'] == 'yes' ) 
     {
       state;
     }
    

    在大多数情况下,这注意到通过使用 @ 符号删除......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2014-02-06
      • 1970-01-01
      • 2011-05-26
      • 2016-04-28
      • 2016-08-04
      相关资源
      最近更新 更多