Массив, переданный в each(), равен нулю

#php #arrays

#php #массивы

Вопрос:

Я пытаюсь сохранить некоторые данные в массив. Однако созданный мной общедоступный массив становится нулевым внутри each() . Как исправить?

 public $questions = array();

public function crawl(){
    $questions = array();
    $client = new Client();
    $crawler = $client->request('GET', 'https://indiabusinessquiz.com/');
    $crawler->filter('p > strong')->each(function ($node) {       
      $ques = $node->text();
      echo $ques;
      var_dump($ques);
      array_push($questions, $ques);
    });
}
  

Ошибка:
Исключение ErrorException в Crawler.php строка 20:
array_push() ожидает, что параметр 1 будет массивом, задается значение null

Ответ №1:

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

 $crawler->filter('p > strong')->each(function ($node) use (amp;$questions) {       
  $ques = $node->text();
  echo $ques;
  var_dump($ques);
  array_push($questions, $ques);
});
  

Кстати, $questions переменная в функции не совпадает со $questions свойством класса. Вам нужно сделать:

 $this->questions = $questions;
  

в конце функции, если вы хотите, чтобы она сохранялась в свойстве класса.

Комментарии:

1. Я сделал это, но по какой-то причине, когда я var_dump массив $questions, он возвращает пустой.

2. Мне нужно было сделать его ссылкой, иначе он изменяет копию массива.