【问题标题】:PHP Notice: Undefined offset: 1 with array when reading dataPHP注意:未定义的偏移量:读取数据时带有数组的1
【发布时间】:2013-07-01 15:14:25
【问题描述】:

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

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

【问题讨论】:

  • 您如何确定文件中的每一行都有一个冒号?
  • 做一个var_dump($parts)。你可能会发现你得到那个未定义的偏移量的点,parts数组中没有1键。
  • 如果看起来所有行都有一个冒号,请检查是否有空行。
  • 您只需要在完成作业之前确保 count($parts) == 2。

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


【解决方案1】:

2020 年 PHP7 更新:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          如果计数为 140,我的偏移量始终是最后一个值,然后它会显示 offset 140,但使用负 1 后一切正常

          【讨论】:

          • 实际上你想将&lt;= 更改为&lt; 并且不要减去1 你的$len 变量。
          • 感谢各位领导,我最近在做另一个项目时意识到了这一点
          【解决方案6】:

          在文件中隐藏 php 警告

          error_reporting(0);
          

          【讨论】:

          • 该通知的存在是有原因的,取消它只是意味着您的不良代码将安静地运行。最好更改您的代码,使其不再糟糕。
          • 大声笑,你认为隐藏问题是解决问题的方法吗?!
          • 是的。为什么要写条件(如果数据为空)?这是一个解决方案
          【解决方案7】:

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

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

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

          【讨论】:

            【解决方案8】:

            改变

            $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

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

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

                error_reporting = E_ALL & ~E_NOTICE
                

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-01-22
                  • 2023-03-27
                  • 1970-01-01
                  • 2023-03-13
                  • 1970-01-01
                  • 2011-10-26
                  • 2015-07-24
                  相关资源
                  最近更新 更多