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>"; });
问题原因与修复方案
问题根源
- 变量作用域限制:匿名函数内部无法直接访问外部的
$trial数组,PHP会将其视为未初始化的局部变量,导致array_push操作的不是你定义的空数组。 - 语法错误:
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
相关产品推荐
相关产品推荐

