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


72

我收到此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)。您可能会发现获得未定义偏移量的点,1部件数组中没有键。
Marc B

2
如果看起来所有行都带有冒号,请检查是否有空行。
Barmar

您只需要在进行分配之前确保count($ parts)== 2。
Orangepill 2013年

Answers:


132

更改

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

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

如果定界符为空字符串(“”),则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 : //stackoverflow.com/a/5373824/445131


3

2020年Php7更新:

使用Null合并运算符可以做到这一点,这是一种更好的方法,只需执行以下操作即可:

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

1

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

  $len = count($data);

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

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


实际上,您想要更改<=<并且不要减去1您的$len变量。
A1rPun

感谢负责人,我最近在进行另一个项目时意识到这一点
Daniel Charles Mwangila

1

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

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

1

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


0

这是“ PHP通知”,因此从理论上讲您可以忽略它。变更php.ini

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

error_reporting = E_ALL & ~E_NOTICE

这会显示所有错误,除非另行通知。


-1

我最近才遇到这个问题,甚至都不敢相信这是我的错字:

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

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


-1

在文件中隐藏PHP警告

error_reporting(0);

3
该通知的存在是有原因的,取消它只是意味着您的不良代码将安静地运行。最好更改您的代码,使其不再贫穷。
jcorry

大声笑,您认为隐藏问题是解决问题的方法吗?
阿姆鲁

-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!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.