PHP注意:未定义的偏移量:读取数据时带有数组的1

时间:2013-07-03 19:15:03

标签: php error-handling syntax-error undefined fatal-error

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

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

11 个答案:

答案 0 :(得分:104)

更改

$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的数组。

根据php.net possible return values from explode

  

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

     

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

答案 1 :(得分:19)

如何在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

答案 2 :(得分:3)

Php7中的2020年更新:

使用Null coalescing运算符是执行以下操作的更好方法:

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

答案 3 :(得分:1)

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

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

error_reporting = E_ALL & ~E_NOTICE

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我刚刚遇到这个问题,我甚至不相信这是我的错误:

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

实际上它是!我只是不小心输入了“”而不是“”......

答案 6 :(得分:0)

在文件中隐藏php警告

error_reporting(0);

答案 7 :(得分:0)

我最快的解决方案是将数组的长度减负为

  $len = count($data);

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

如果计数为140,我的偏移量始终是最后一个值,那么它将显示offset 140,但是在使用减号1之后,一切都很好

答案 8 :(得分:0)

理想的解决方案如下。您不会错过0到n之间的值。

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

答案 9 :(得分:-1)

错误的输出是因为您调用了不存在的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!

答案 10 :(得分:-5)

你也可以尝试删除警告......

error_reporting=0