使用 explode(..) 后 PHP 数组中的“未定义偏移量”


"Undefined offset" in PHP array after using explode(...)

你能告诉我为什么给我看大量的通知吗?

我是 php 的新手,不明白我的错误在哪里,从行通知:

<td>'.$columns[1].'</td> 

要行:

$sum+=$columns[2];

这是我的代码:

<?php
         if(file_exists('data.txt'))
         {
             $result= file('data.txt');
             $sum='0';
             foreach($result as $value)
             {
                 $columns=explode('-', $value);
                 echo  '<tr>
                             <td>'.$columns[0].'</td>
                             <td>'.$columns[1].'</td>
                             <td>'.$columns[2].'</td>
                             <td>'.$kinds[trim($columns[3])].'</td>
                        </tr>';
                 $sum+=$columns[2];
             }
             echo '<tr>
                <td>--</td>
                <td>--</td>
                <td>' . $sum . ' </td>
                <td>--</td>
            </tr>'; 

         }             
         ?>

我是 php 的新手,不明白我的错误在哪里:(来自线路的通知

<td>'.$columns[1].'</td> 

到行

$sum+=$columns[2];

以下是通知:

Notice: Undefined offset: 3 in C:'xampp'htdocs'HomeworkOne'index.php on line 31 
Notice: Undefined index: in C:'xampp'htdocs'HomeworkOne'index.php on line 31
Notice: Undefined offset: 2 in C:'xampp'htdocs'HomeworkOne'index.php on line 33
Notice: Undefined offset: 1 in C:'xampp'htdocs'HomeworkOne'index.php on line 29
Notice: Undefined offset: 2 in C:'xampp'htdocs'HomeworkOne'index.php on line 30
Notice: Undefined offset: 3 in C:'xampp'htdocs'HomeworkOne'index.php on line 31
Notice: Undefined index: in C:'xampp'htdocs'HomeworkOne'index.php on line 31

您正在使用未初始化的变量。 $columns[1]$columns[2]$columns[3]没有得到值请尝试此更正的代码:

<?php
if(file_exists('data.txt'))
{
    $result= file('data.txt');
    $sum='0';
    foreach($result as $value)
    {
        $columns=explode('-', $value);
        $kindsDisplay = (isset($columns[3]) && ! empty($kinds[trim($columns[3])])) ? $kinds[trim($columns[3])] : '';
        $one = isset($columns[1]) ? $columns[1] : '';
        $two = isset($columns[2]) ? $columns[2] : '';
        $sum+= isset($columns[2]) ? $columns[2] : 0;
        echo  '<tr>
                   <td>'.$columns[0].'</td>
                   <td>'.$columns[1].'</td>
                   <td>'.$columns[2].'</td>
                   <td>'.$kindsDisplay.'</td>
               </tr>';
    }
    echo '<tr>
              <td>--</td>
              <td>--</td>
              <td>' . $sum . ' </td>
              <td>--</td>
          </tr>'; 
} ?>
这是一个

未定义的偏移量:

$array[0] = "test1";
$array[1] = "test2";
echo $array[3];

您最好使用知道里面内容的对象或数组。

要摆脱,请使用以下条件:

$array[0] = "test1";
$array[1] = "test2";
if (array_key_exists(3, $array)) {
    echo $array[3];
}

您案例中的问题:

$columns = explode('-', $value);

从文本文件中 grep 获取的数据不是 100% 的预期格式,例如:

aaaaa-bbbbbb-cccccc-ddddddd
aaaaa--cccccc-dddddd
aaaaa-ddddd

这意味着,您需要验证您读取的数据是否有效且格式正确。

需要考虑的一些事项:如果文件末尾的空行只发生一次(不是每行),可能会导致此问题。

如果您希望在数据缺少分隔符的情况下使用默认值,您可以添加

$columns = $columns + array('default_for_key0', 'default1', 'default2', 'default3');

explode()后.

您读取数据文件的每一行。当您有一个空行时,您的$result中没有数据。

然后你尝试在空字符串上爆炸,columns[0]没有设置。

尝试检查数组是否不为空,也许使用

if(count($columns) > 2) {
}

或检查阵列是否设置。

if(isset($columns[0])) {
}

否则,您可以使用默认数据填充数组。

您的数据可能并不像您想象的那么理智。

$columns=explode('-', "abc");
$columns[0]; // "abc";
$columns[1]; // gives: Undefined offset 1

要么确保您的数据符合您的预期,要么明确尝试查找错误情况,例如没有-的行。

您可以执行count($columns)以了解有多少列。


要非常警惕以下结构:

$kinds[trim($columns[3])]

这里有 2 个可能的未定义偏移量。 $columns[3]$kinds[#index#]都可以是未定义的。

尝试这种方式,您将看到每次是否有 4 列:

<?php
if (file_exists('data.txt')) {
    $result= file('data.txt');
    $sum=0;
    foreach($result as $value) {
        $columns=explode('-', $value);
        echo  '<tr>';
        foreach ($columns as $key => $column) {
            echo '<td>'.$column.'</td>';
            if ($key == 2) $sum += $column;
        }
    echo '</tr>';
    echo '<tr><td>--</td><td>--</td><td>'.$sum.'</td><td>--</td></tr>'; 
}             
?>

首先,您需要将$kinds设置为数组。其次,在程序中使用之前检查数组键,否则它将抛出如下错误:http://d.pr/i/GzVk

检查修改后的代码,希望对您有所帮助。

<?php
if(file_exists('data.txt'))
{
$result= file('data.txt');
$sum='0';
$kinds = array();
foreach($result as $value)
{
$columns=explode('-', $value);
if(array_key_exists($columns[0], $columns)) {
echo '<td>'.$columns[0].'</td>';
}
if(isset($columns[1]) && array_key_exists($columns[1], $columns)) {
echo '<td>'.$columns[1].'</td>';
}
if(isset($columns[2]) && array_key_exists($columns[2], $columns)) {
echo '<td>'.$columns[2].'</td>';
$sum+=$columns[2];
}
if(isset($columns[3]) && array_key_exists($columns[3], $columns)) {
echo '<td>'.$kinds[trim($columns[3])].'</td>';
}
echo      '</tr>';

}
echo '<tr>
<td>--</td>
<td>--</td>
<td>' . $sum . ' </td>
<td>--</td>
</tr>';

}
?>