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

我得到这个 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_:
}

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

422043 次浏览

改变

$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;

并不是文件的每一行都有冒号,因此在它上面爆炸会返回一个大小为1的数组。

根据 Net 可能的返回值来自 < strong >  爆炸 :

返回通过在分隔符形成的边界上分割字符串参数创建的字符串数组。

如果分隔符是空字符串(“”) , 爆炸()將返回 FALSE。如果分隔符包含字符串中未包含的值,并且使用了负限制,则将返回一个空数组 否则将返回包含字符串的数组。

这是一个“ PHP 通知”,所以理论上你可以忽略它。更改 php.ini:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

error_reporting = E_ALL & ~E_NOTICE

这将显示除通知外的所有错误。

如何在 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://stackoverflow.com/a/5373824/445131

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

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

事实上就是这样! 我只是不小心输入了“ .”而不是“ ,”..。

我的最快解决方案是 -1的数组长度为

  $len = count($data);


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

我的偏移量总是最后一个值,如果计数是140,那么它会说 offset 140,但是在使用 -1之后一切都没问题

理想的解应该如下所示,你不会错过0到 n 的值。

$len=count($data);
for($i=0;$i<$len;$i++)
echo $data[$i]. "<br>";

错误的输出,是因为您调用了 Array 的一个不存在的索引,例如

$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!

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

2020年 Php7更新:

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

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