【问题标题】:PHP - Notice Undefined offsetPHP - 注意未定义的偏移量
【发布时间】:2016-02-12 11:59:57
【问题描述】:

我的 php 脚本中有一个我不明白的问题。我知道关于这个问题有几个问题,但没有一个适合我的问题。

我实际上有一个输入文件,由名为testfile.txt 的制表符分隔。

使用这个 txt 文件,我创建了一个名为 result.txt 的新文件,其中我在第 0 列和第 7 列中获取 testfile 的内容。

当我执行我的 php 脚本时,我得到了这个错误:

注意:未定义的偏移量:7

我不明白的是,我的result.txt 是用我的testfile.txt 的第 0 列和第 7 列中包含的数据很好地创建的。如果我这样做:

echo $dataFromTestFile[7];

我在第 7 列中有输出内容。

所以我真的不明白为什么我有这个通知以及如何删除它。

这是我的 php 脚本:

<?php
if (false !== ($ih = fopen('/opt/lampp/htdocs/ngs/tmp/testfile.txt', 'r'))) {
    $oh = fopen('/opt/lampp/htdocs/ngs/tmp/result.txt', 'w');

    while (false !== ($dataFromTestFile = fgetcsv($ih,0,"\t"))) {
        // this is where I build my new row
        $outputData = array($dataFromTestFile[0], $dataFromTestFile[7]);
        fputcsv($oh, $outputData);
        //echo $dataFromTestFile[7];
    }

    fclose($ih);
    fclose($oh);
}
?>

testfile.txt的样本数据:

Input   Errors  AccNo   Genesymbol  Variant Reference   Coding  Descr.  Coding
aaa ddd fdfd    dfdf    fefefd  ref1    fdfdfd  fdfdf   dfdfde

【问题讨论】:

  • var_dump($dataFromTestFile) 在此通知之前的行上。您很可能会看到 一个特定的行(或两个或三个)实际上并没有 7 列,无论出于何种原因。
  • 我想,array($dataFromTestFile[0], $dataFromTestFile[6]);
  • 您可以检查array_key_exists(7, $dataFromTestFile) 是否为假,如果它为假,则使用一些默认值(即0)而不是$dataFromTestFile[7],或者不将行写入输出。
  • 如果您不包含来自 testfile.txt 的一些示例数据,人们如何帮助您?

标签: php arrays offset


【解决方案1】:

我怀疑这是导致错误的行:

$outputData = array($dataFromTestFile[0], $dataFromTestFile[7]);

您正在尝试使用特定索引处的数组元素,而不检查它们是否确实存在。

另外,您正在尝试将数组对象写入结果文件,您的意思是在该文件中创建一个逗号分隔值吗?

试试这个:

$source = '/opt/lampp/htdocs/ngs/tmp/testfile.txt';
$result = '/opt/lampp/htdocs/ngs/tmp/result.txt';

if (($handle = fopen($source, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
        if (isset($data[0]) && isset($data[7])) {
            file_put_contents($result, $data[0] .','. $data[7] ."\r\n");
        }
    }
    fclose($handle);
}

或者,您也可以将结果写为 csv,如下所示:

$sourceFile = '/opt/lampp/htdocs/ngs/tmp/testfile.txt';
$resultFile = '/opt/lampp/htdocs/ngs/tmp/result.txt';
$resultData = array();

// Parse source file
if (($handle = fopen($sourceFile, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
        if (isset($data[0]) && isset($data[7])) {
            $resultData[] = array($data[0], $data[7]);
        }
    }
    fclose($handle);
}

// Write result file
if (sizeof($resultData)) {
    $h = @fopen($resultFile, 'w');
    if (!$h) {
        exit('Failed to open result file for writing.');
    }
    foreach ($resultData as $resultRow) {
        fputcsv($h, $resultRow, ',', '"');
    }
    fclose($h);
}

【讨论】:

  • 感谢您的脚本。实际上,您的第一个脚本仅将我的输入文件的一行存储到我的 result.txt 文件中。您的第二个脚本完美运行,不再是notice Undefined offset: 7。再次感谢。
  • 啊,对第一个脚本很抱歉。那是一个小错误。 file_put_contents 将在每次迭代时覆盖文件。忽略它。
【解决方案2】:

确保第 7 列存在于您的 testfile.txt 中——我猜从零开始时它可能是第 6 列——你也可以

var_dump($dataFromTestFile)

为了获取变量的内容 - 数组键和值可能对您的问题感兴趣

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多