PHP嵌套循环出现Undefined variable错误,如何传递变量生成数组?
PHP Crawler嵌套循环变量未定义错误及解决方法
使用Symfony Crawler组件抓取页面构建$categories数组时,出现Undefined variable: name_one错误,原代码如下:
$categories = array(); $crawler ->filter('.am-filter-items-attr_category_ids') ->each(function ($node) use ($client) { $node->filter('ul > li ')->each(function ($level2) { $name_one = $level2->text(); $level2->filter(' ul > li > a')->each(function ($level3) { $href = $level2->extract(array('href')); $categories[] = array('cat' => $href[0], 'Cat_name' => $name_one); } } }
错误信息:
Undefined variable: name_one
问题原因
PHP匿名函数(闭包)拥有独立作用域,内层闭包无法直接访问外层闭包定义的变量;同时如果要修改外部的$categories数组,必须通过引用传递,否则只会在闭包内部创建同名局部变量,无法同步修改外部数组。
修正后的代码
$categories = array(); $crawler ->filter('.am-filter-items-attr_category_ids') ->each(function ($node) use ($client, &$categories) { // 传递$categories的引用 $node->filter('ul > li')->each(function ($level2) use (&$categories) { $name_one = $level2->text(); // 内层闭包通过use获取$name_one,同时传递$categories引用 $level2->filter('ul > li > a')->each(function ($level3) use ($name_one, &$categories) { // 用当前<a>节点$level3提取href,原代码用$level2是错误的 $href = $level3->extract(['href']); // 增加空值判断,避免索引越界 if (!empty($href[0])) { $categories[] = [ 'cat' => $href[0], 'Cat_name' => $name_one ]; } }); }); });
关键修改点
- 作用域传递:内层闭包通过
use($name_one)获取外层闭包的变量。 - 数组引用传递:所有需要修改
$categories的闭包都要通过&$categories传递引用,确保外部数组能被修改。 - 修复节点提取错误:原代码错误地用父节点
$level2提取href,改为用当前<a>节点$level3提取。 - 补全语法错误:补充原代码缺失的闭包结束括号,修复语法解析问题。
- 增加空值判断:避免因href不存在导致的索引越界错误。
内容的提问来源于stack exchange,提问作者kaserr
相关产品推荐
相关产品推荐

