PHP - 注意未定义的偏移量

时间:2016-02-12 11:59:58

标签: php arrays offset

我的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

2 个答案:

答案 0 :(得分:0)

确保第7列存在于testfile.txt中 - 我猜从0开始时它可能是第6列 - 也可以

var_dump($dataFromTestFile)

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

答案 1 :(得分:0)

我怀疑这是造成错误的一行:

$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);
}