81

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

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

4

10 回答 10

144

改变

$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 的可能返回值explode

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

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

于 2013-07-03T19:32:00.280 回答
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 ://stackoverflow.com/a/5373824/445131

于 2014-02-15T03:50:21.390 回答
3

2020 年 PHP7 更新:

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

$data[$parts[0]] = $parts[1] ?? null;
于 2020-08-23T02:46:25.890 回答
1

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

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

error_reporting = E_ALL & ~E_NOTICE

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

于 2013-07-16T20:28:29.093 回答
1

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

$len=count($data);
for($i=0;$i<$len;$i++)
     echo $data[$i]. "<br>";
于 2019-04-05T09:01:09.227 回答
1

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

于 2020-08-02T16:53:38.653 回答
1

我最快的解决方案是将数组的长度减去 1

  $len = count($data);

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

如果计数是 140,我的偏移量始终是最后一个值,那么它会说offset 140,但是在使用负 1 之后一切都很好

于 2018-12-16T10:03:19.090 回答
-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!
于 2019-12-21T12:36:21.817 回答
-1

在文件中隐藏php警告

error_reporting(0);
于 2018-04-08T19:34:48.483 回答
-1

我最近才遇到这个问题,我什至不相信这是我的错误输入:

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

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

于 2017-07-30T18:42:07.663 回答