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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:50:39