如何在php中修复“未捕获的错误:在null上调用成员函数insertOne()”

问题描述 投票:0回答:1

我按照这里介绍的解决方案https://stackoverflow.com/a/36041188/11295637创建了一个新的csv文件,并将一个大型csv文件的特定列提取到新的。但是,我收到此错误:未捕获错误:在null上调用成员函数insertOne()。

代码如下:

php

$new= Writer::createFromPath('path\to\file', 'w+');
$filename= Reader::createFromPath($filename, 'r');
          $filename->setOffset(1);
          $filename->each(function ($row) use ($indexes) {
            $new->insertOne($row);
            return true;
          });

问题是新变量未定义。我也试过了

php
$new= Writer::createFromFileObject(new SplTempFileObject());

但我得到了同样的错误。

php csv flysystem thephpleague
1个回答
0
投票

在PHP中,如果要引用在函数外部定义的变量,则必须(a)在匿名函数签名中使用use限定符或(b)在函数内使用global语句。

在您的情况下,您有一个use限定符,但它引用了一个变量$indexes。我没有在你的代码中看到$ indexes变量,所以你需要在该列表中添加$ new或者用$ new替换$ indexes。

$new = Writer::createFromPath('path\to\file', 'w+');
$filename = Reader::createFromPath($filename, 'r');
$filename->setOffset(1);
$filename->each(function ($row) use ($new) {
    $new->insertOne($row);
    return true;
});

要仅选择$indexes变量中指定的索引,应从$ row中选择某些键,然后重新构建新行。你可以使用array_fliparray_intersect_key来做到这一点。

// convert [cat, dog] => [cat => 0, dog => 1]
$indexKeys = array_flip($indexes);
$filename->each(function ($row) use ($new, $indexKeys) {
    $selectedCols = array_intersect_key($row, $indexKeys);
    $new->insertOne($selectedCols);
    return true;
});
© www.soinside.com 2019 - 2024. All rights reserved.