You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony Dom Crawler each中array_push报错:参数需为数组

Symfony DomCrawler 数组填充失败问题排查

我在用Symfony DomCrawler过滤元素、提取节点数据推入数组转JSON时遇到问题:代码抛出Uncaught TypeError: array_push(): Argument #1 ($array) must be of type array错误,而且print_r能正确输出$holder的name和url值,但最终$trial数组是空的;直接输出节点内容的each代码却能正常运行。

报错代码示例

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']);
            // 能正确输出值
            print_r($holder['url']);
            // 能正确输出值
;               array_push($trial, $holder);

    });    
    var_dump($trial);
}

正常运行的代码示例

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

问题原因与修复方案

问题根源

  1. 变量作用域限制:匿名函数内部无法直接访问外部的$trial数组,PHP会将其视为未初始化的局部变量,导致array_push操作的不是你定义的空数组。
  2. 语法错误:array_push语句前多了一个多余的分号,导致该行代码无法被正确执行。

修复后的代码

if($query == 'begin') {
    $persons = $crawler->filter('#content > table > tr > td > a');
    $trial = [];
    // 通过use(&$trial)传递数组引用,让闭包能修改外部数组
    $persons->each(function (Crawler $node) use (&$trial) {
        $holder['name'] = $node->text();
        $holder['url'] = $node->attr('href');
        array_push($trial, $holder);
        // 也可以用更简洁的写法:$trial[] = $holder;
    });    
    var_dump($trial);
}

内容的提问来源于stack exchange,提问作者monkeytrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:53:16