Php 第一个元素没有编号,并且编号不会在新类别中重置

Php 第一个元素没有编号,并且编号不会在新类别中重置,php,goutte,Php,Goutte,我尝试爬网此页面: 这是我的密码 <?php require_once 'vendor/autoload.php'; use Goutte\Client; $client = new Client(); $crawler = $client->request('GET', 'http://hea.uum.edu.my/index.php/academic/current-student/convocation'); $step = array(); $i = 0; $cra

我尝试爬网此页面:

这是我的密码

<?php
require_once 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'http://hea.uum.edu.my/index.php/academic/current-student/convocation');


$step = array();
$i = 0;
$crawler->filter('.sppb-addon.sppb-addon-accordion')->each(function ($node) {
    global $step, $i;
    $step[$i]['item'] = array();

    $node->filter('.sppb-addon-title')->each(function ($node) {
        global $step, $i;
        $step[$i]['cat'] = $node->html();
    });

    $j = 0;
    $node->filter('.sppb-panel-heading > .sppb-panel-title')->each(function ($node) {
        global $step, $i, $j;
        $step[$i]['item'][$j++]['title'] = $node->html();
    });

    $h = 0;
    $node->filter('.sppb-panel-body .sppb-addon-content')->each(function ($node) {
        global $step, $i, $h;
        $step[$i]['item'][$h++]['content'] = $node->html();
    });

    $i++;

});

print_r($step);

刚刚测试了一个虚拟设置,我认为解决方案是在任何嵌套函数之外定义
$j
$h
。原因是它们不是在全局范围内定义的,所以当你说
global$step,$i,$j
然后
$j++
,这将在第一次将其视为未定义,然后post增量将其设置为1。显示这一点的测试代码是

$a = function() {
    global $c;
    echo "Value=";
    echo $c++;
    echo PHP_EOL;
};

$a();
$a();
输出

Value=
Value=1
鉴于

$c=0;
$a = function() {
    global $c;
    echo "Value=";
    echo $c++;
    echo PHP_EOL;
};

$a();
$a();
给出所需的输出

Value=0
Value=1
因此,在开始时定义所有这些

$i = 0;
$j = 0;
$h = 0;
编辑: 虽然根据我最初的评论,
global
通常是不受欢迎的,但它会使测试变得更加困难,而且(正如发现的那样)可能不会像您预期的那样工作。建议的方法是使用
函数(…)使用(…){
方法格式,因此在示例中

$c=0;
$a = function() use (&$c) {
    echo "Value=";
    echo $c++;
    echo PHP_EOL;
};

$a();
$a();

尝试在$i而不是在代码的中间定义$j和j。我还将学习如何避免使用<代码> Global < /Cord>并查看<代码>函数()()({ /Cuth>)(在这种情况下)@奈杰伦:你为什么不把这个作为答案呢?我会试试你的建议,我现在开车。事实上,我按照你的建议使用“使用”,效果很好。你可以更新你的答案。谢谢你的帮助!
$i = 0;
$j = 0;
$h = 0;
$c=0;
$a = function() use (&$c) {
    echo "Value=";
    echo $c++;
    echo PHP_EOL;
};

$a();
$a();