Symfony Dom Crawler Array Push Each

yc0p9oo0  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(127)

我被这个问题难倒了。我使用Symfony的Dom爬虫来过滤一些元素,然后提取节点数据推送到可以转换为json的数组中。然而下面的代码抛出了一个“Uncaught TypeError:array_push():Argument #1($array)must be of type array”错误。

if($query == 'begin') {
      $persons = $crawler->filter('#content > table > tr > td > a');
        $trial = [];
            $persons->each(function (Crawler $node) {

                $holder['name'] = $node->text();
                $holder['url'] = $node->attr('href');
                print_r($holder['name']);
                // Correct value printed
                print_r($holder['url']);
                // Correct value printed
;               array_push($trial, $holder);

    });    
    var_dump($trial);

print_r显示期望的键值,但$trail数组为空。
然而,当我尝试时,给出了正确的值:

$persons->each(function (Crawler $node) {
                    echo "<div class='col col-lg-3'>
                            <a href='{$node->attr('href')}'>{$node->text()}</a>   
                          </div>";
                });
k4aesqcs

k4aesqcs1#

你的问题是在变量作用域中。函数each有自己的局部作用域。变量$trial在上层函数的局部作用域中。有两个不同的局部作用域,这就是为什么你不能“看到”这个变量的原因。

$persons = $crawler->filter('#content > table > tr > td > a');
      $holders = $persons->each(function (Crawler $node) {

                $holder['name'] = $node->text();
                $holder['url']  = $node->attr('href');
                
                return $result[$holder['name']] = $holder['url'];
       });
6ljaweal

6ljaweal2#

似乎问题是返回foreach循环上的值。设法用下面的代码解决它:

if($query == 'begin') {
    
  $trial = [];

  $persons = $crawler->filter('#content > table > tr > td > a');

  $trial = $persons->each(function (Crawler $node)  {

    $holder['name'] = $node->text();
    $holder['url'] = $node->attr('href');

    return $holder;

});

此线程的帽尖-https://github.com/FriendsOfPHP/Goutte/issues/266

相关问题