【问题标题】:Undefined index: Array, when the index is defined未定义索引:数组,定义索引时
【发布时间】:2012-12-08 12:43:24
【问题描述】:

这让我抓狂,因为我需要 E_ALL 出于其他原因打开。我无法摆脱这个错误。

这是我的功能:

public static function getFileCatsString($categories)
{
    if (empty($categories)) {
        return '';
    }
    $cats = self::getFileCats();

    $file_cats_string = '';
    $categories_array = explode(',',$categories);
    foreach($categories_array as $k=>$category_id) {
        $file_cats_string.=$cats[$category_id].', ';
    }
    $file_cats_string = rtrim($file_cats_string, ', ');
    return($file_cats_string);
}

类别存储在键控数组中:[id]=>[string]

通过的$categories 是一个category_ids 字符串(为什么会这样)

getFileCats() 方法获取所有可用类别的列表。

所以我们分解逗号列表来创建一个数组,然后循环遍历该数组。当我得到一串类别 ID 时,我只想创建一串类别标签。 PHP 返回此警告:

注意:未定义索引:第 40 行 Documents.php 中的数组

第 40 行是:

      $file_cats_string.=$cats[$category_id].', ';

显然未定义的索引是$cats[$category_id]。但这就是奇怪的地方。

如果我使用 die() 语句并回显 $cats[$category_id] 我确实得到了一个字符串,而不是一个数组。

顺便说一下,这里是三个关键数据的输出,其中一个 die() 语句放在 foreach 循环的顶部。

$categories_array:

数组 ( [0] => 2 )

$cats:

数组 ( [9] => 类别 19 [8] => 类别 8 [7] => 类别 7 [6] => 我为隐私更改的另一个字符串 [5] => AED 销售 [4] => Preceptor文件夹 [3] => 教育手册 [2] => 表格 [1] => 指南和政策 )

$cats[$category_id]

表格

$category_id

2

但它变得更奇怪了。它说索引是一个数组(这确实是一个问题),所以我试着把:

        if (is_array($category_id)) {
            die(print_r($categories_array, true) . '<br />' . print_r($cats, true) . '<br />' . $cats[$category_id] . '<br />' . $category_id);
        }

看看我是否可以识别出一个防御数据,但它永远不会消失。那么到底发生了什么?! (我偷偷怀疑答案会很简单。)

【问题讨论】:

  • 尝试var_dump($cats, $categories_array); 并检查您实际处理的数据。

标签: php arrays


【解决方案1】:

知道将 PHP 中的 any 数组转换为字符串会导致字符串的事实,该错误更容易理解:

"Array"

(这也在 PHP 手册中的Type Juggling 中进行了概述)

正好发生在第 40 行:

$file_cats_string .= $cats[$category_id] . ', ';
                           ^^^^^^^^^^^^

此时的变量$category_id 是一个数组。修复它。有效的数组索引/键是整数或字符串,但不是数组。

【讨论】:

  • 啊哈!好的,所以问题确实是数据,但我没有以正确的方式看待它。我被“阵列”的存在吓坏了。我正在测试该值是一个数组(使用 is_array()),但该字符串实际上是“数组”,因为数据库中的某些条目实际上被存储为“数组”,因为程序中的其他地方存在错误.如此简单!
  • 好的,那么原因相同,但位置不同。您将错误“存储”到准数据库中。确实,这些事情很难追踪。
  • 顺便说一句,为了解决坏数据的问题,我使用了:if (!empty($cats[$category_id])){ $file_cats_string.= $cats[$category_id].', ';}。就像我说的那样。额头拍打简单。
【解决方案2】:

foreach 循环中,语法foreach($categories_array as $k=&gt;$category_id) { 表示$kkey$category_id 是每个索引/键的value。因此,该数组没有将其值之一作为索引的值,这就是错误显示 undefined index 的原因。

由于$category_id不是一个数组,它的值为2,它没有通过if (is_array($category_id))的检查

【讨论】:

  • foreach 循环设置正确。这不是问题。
  • 我没有说问题出在 foreach 上,只是理解它的语法,并相应地使用键/值对。
  • 查看接受的答案和 cmets。您的解决方案也是我最初的想法,但问题是“数组”这个词实际上是在数据中 - 这是错误数据的问题,而不是错误的 foreach 循环(您可以在 cmets 中看到foreach 循环设置正确,并经过验证)。
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 2011-08-15
  • 2012-09-18
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多