PHP提示:读取数据时使用数组时未定义偏移量1

85

我遇到了这个 PHP 错误:

PHP Notice:  Undefined offset: 1

这是抛出该异常的 PHP 代码:

$file_handle = fopen($path."/Summary/data.txt","r"); //open text file
$data = array(); // create new array map

while (!feof($file_handle) ) {
    $line_of_text = fgets($file_handle); // read in each line
    $parts = array_map('trim', explode(':', $line_of_text, 2)); 
    // separates line_of_text by ':' trim strings for extra space
    $data[$parts[0]] = $parts[1]; 
    // map the resulting parts into array 
    //$results('NAME_BEFORE_:') = VALUE_AFTER_:
}

这个错误是什么意思?是什么导致了这个错误?


2
你有多确定文件中的每一行都有一个冒号? - andrewsi
执行 var_dump($parts)。你可能会发现在出现未定义的偏移量时,parts 数组中没有 1 键。 - Marc B
2
如果所有行都有冒号,请检查是否有空行。 - Barmar
在进行赋值操作之前,确保 $parts 数组的元素数量为 2。 - Orangepill
9个回答

146

改变

$data[$parts[0]] = $parts[1];

if ( ! isset($parts[1])) {
   $parts[1] = null;
}

$data[$parts[0]] = $parts[1];

或者简单地说:

$data[$parts[0]] = isset($parts[1]) ? $parts[1] : null;

并非您文件中的每行都有一个冒号,因此对其进行explode操作将返回一个大小为1的数组。

根据php.net关于explode的可能返回值:

通过使用分隔符形成的边界拆分字符串参数而创建的字符串数组。

如果分隔符是一个空字符串(""),则explode()将返回FALSE。如果分隔符包含一个未包含在字符串中且使用了负限制的值,则将返回一个空数组,否则将返回包含字符串的数组。


21

如何在PHP中重现上述错误:

php> $yarr = array(3 => 'c', 4 => 'd');

php> echo $yarr[4];
d

php> echo $yarr[1];
PHP Notice:  Undefined offset: 1 in 
/usr/local/lib/python2.7/dist-packages/phpsh/phpsh.php(578) : 
eval()'d code on line 1

这个错误信息是什么意思?

这意味着 PHP 编译器查找键 1 并运行哈希,但未找到任何与其关联的值,然后报错 Undefined offset: 1

我该如何消除这个错误?

在返回值之前,通过询问数组是否存在该键来避免这个错误,例如:

php> echo array_key_exists(1, $yarr);

php> echo array_key_exists(4, $yarr);
1
如果数组中不包含您的键,请勿请求其值。尽管这种解决方案为程序“检查是否存在”然后“获取它”增加了额外的工作量。
更快的替代解决方案:如果获取缺失的键是由错误引起的异常情况,则直接获取该值(如 echo $yarr[1]; ),并捕获偏移错误并像这样处理:https://dev59.com/zW435IYBdhLWcg3whAWx#5373824

4

2020年在Php7中的更新:

现在有一种更好的方法可以使用空值合并运算符,只需执行以下操作:

$data[$parts[0]] = $parts[1] ?? null;

1
理想的解决方案如下。您不会错过从0到n的值。
$len=count($data);
for($i=0;$i<$len;$i++)
     echo $data[$i]. "<br>";

1
这是一个“PHP Notice”,理论上您可以忽略它。请更改php.ini
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

error_reporting = E_ALL & ~E_NOTICE

这显示所有错误,除了通知。

1
在你的代码中: $parts = array_map('trim', explode(':', $line_of_text, 2)); 你使用 ":" 作为分隔符。如果你在文件中使用另一个分隔符,那么你将会得到一个 "未定义的偏移量: 1" 而不是 "未定义的偏移量: 0" 所有的信息都将在 $parts[0] 中,但是没有信息在 $parts[1] 或 [2] 等中。尝试 echo $part[0]; echo $part[1]; 你将看到信息。

1

我的最快解决方法是将数组长度减1,如下:

  $len = count($data);

    for($i=1; $i<=$len-1;$i++){
      echo $data[$i];
    }

如果计数为140,则我的偏移始终是最后一个值,它将显示offset 140,但使用减1后一切都正常了。


实际上,您想将 <= 更改为 <,并且不要减去 $len 变量的值。 - A1rPun
谢谢提醒,我最近在另一个项目中工作时意识到了这一点。 - Daniel Charles Mwangila

-1

我最近遇到了这个问题,甚至不相信是我的打字错误:

Array("Semester has been set as active!", true)
Array("Failed to set semester as active!". false)

实际上就是这样!我只是不小心输成了“”而非“,”...


-1
错误的输出是因为你调用了一个不存在的数组索引,例如。
$arr = Array(1,2,3);
echo $arr[3]; 
// Error PHP Notice:  Undefined offset: 1 pointer 3 does not exist, the array only has 3 elements but starts at 0 to 2, not 3!

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