Как исправить «Uncaught Error: вызов функции-члена insertOne () на ноль» в php - PullRequest
0 голосов
/ 02 апреля 2019

Я следовал введенному здесь решению https://stackoverflow.com/a/36041188/11295637, чтобы создать новый CSV-файл и извлечь новые столбцы большого CSV-файла в новый. Но я получаю эту ошибку: Uncaught Error: вызов функции-члена insertOne () для null.

Код выглядит следующим образом:

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());

Но я получил ту же ошибку.

1 Ответ

0 голосов
/ 02 апреля 2019

В PHP, если вы хотите сослаться на переменную, определенную вне функции, вы должны либо (а) использовать квалификатор use в сигнатуре анонимной функции, либо (б) использовать оператор global внутри своей функции.

В вашем случае у вас есть квалификатор использования, но он ссылается на переменную $indexes. Я не вижу переменную $ indexes в вашем коде, поэтому вам нужно либо добавить $ new в этот список, либо заменить $ indexes на $ new.

$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_flip и array_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;
});
...