【问题标题】:Undefined index with not array非数组的未定义索引
【发布时间】:2014-05-26 15:09:05
【问题描述】:

只要我没有调试,这个 if 语句就可以正常工作

   if (!is_array($post_options['categoryid']['wpcatid'][1])) { 
       do something
  }

但调试后我收到此通知

注意:未定义索引:wpcatid

现在的问题是定义索引(我假设是 isset),但是如果它被设置并且为空(似乎它是设置或空),这会起作用吗?

无论如何,关于如何摆脱这个未定义的索引通知有什么建议吗?

【问题讨论】:

    标签: php isset


    【解决方案1】:

    您正在检查 $post_options['categoryid']['wpcatid'][1] 是否不是数组,但前面的键 'wpcatid' 也不存在。

    所以你需要结合isset来避免错误。

    以下是一个示例,但您需要的逻辑可能需要不同的语句:

    if (isset(
            $post_options['categoryid'], 
            $post_options['categoryid']['wpcatid'], 
            $post_options['categoryid']['wpcatid'][1]
           ) && 
        !is_array($post_options['categoryid']['wpcatid'][1])
    ) { /* do stuff */ } 
    

    在检查$post_options['categoryid']['wpcatid'][1] 是否不是数组之前,上面会检查所有内容是否按顺序存在。但是,如果它没有设置,但您仍需要运行条件逻辑,则需要根据需要对其进行修改。

    如果您正在编写 Wordpress 插件,则无法更改错误报告级别,并且您绝对不应该求助于错误静默 @ 运算符。

    最好明确列出要在哪些条件下执行逻辑的特定部分。


    从 cmets 看来,您需要的是这样的:

    if (
        empty($post_options['categoryid']) || 
        empty($post_options['categoryid']['wpcatid']) ||
        empty($post_options['categoryid']['wpcatid'][1]) ||
        !is_array($post_options['categoryid']['wpcatid'][1]) 
    )
    

    简单的英语:

    如果(帖子选项中没有类别 id...或者有,但没有 wpcatid,或者有 wpcatid,但其中没有键为 1 的元素,或者有,但该元素不是一个数组)

    【讨论】:

    • 这是有道理的......但是,由于 isset 为假,而 !is_array 为真,这将解析为假。当这解决为真(没有数组)时,我需要做一些事情......这似乎是主要问题......这有意义吗?
    • @Allen 确实如此。这只是根据您的需要调整检查。添加了一些细节。我在那里使用了 empty 而不是 isset - 下面简单的英文解释解释了它的作用。更多细节在这里:stackoverflow.com/questions/1219542/…
    • 实际上,我尝试使用您之前的代码,如果我首先检查某些内容是否为 isset 并且是一个数组(这是我不想要的),这很有意义,因此建议这样做: if (!( isset($post_options['categoryid'], $post_options['categoryid']['wpcatid'], $post_options['categoryid']['wpcatid'][1] ) && is_array($post_options['categoryid'][ 'wpcatid'][1]) )) { //做事}
    【解决方案2】:

    为什么不直接使用isset()? PHP 中的isset() 函数确定变量是否已设置且不为NULL。它返回一个布尔值,即如果设置了变量,则返回true,如果变量值为null,则返回false。

    另一种选择是使用error_reporting(E_ALL ^ E_NOTICE);你也可以在你的php.ini文件或.htaccess文件中关闭错误报告,但如果你还处于测试阶段,这不被认为是明智之举。

    第三,虽然不受欢迎,但使用@suppress 错误选项。您可以在此处找到更多信息。 http://php.net/manual/en/language.operators.errorcontrol.php。我认为你只需要坚持使用isset()的第一个选项

    【讨论】:

    • 谢谢..好吧,这是 wordpress 插件,不幸的是,有些人在调试,所以我用调试进行测试以消除错误和通知。如果 (isset(x) && !is_array(x))... 似乎 isset 是假的,is_array 是真的,所以结果会是假的 - 我原来的陈述是真的
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2011-08-15
    • 2013-11-03
    • 2015-08-07
    • 2017-09-20
    相关资源
    最近更新 更多