Первый элемент не имеет номера и номер не сбрасывается в новой категории - PullRequest
0 голосов
/ 28 июня 2018

Я попытался просканировать эту страницу: http://hea.uum.edu.my/index.php/academic/current-student/convocation

Вот мой код

<?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);

Это почти идеально, за исключением того факта, что первый элемент для item не имеет номера и нумерация не сбрасывается в новом массиве.

    Array
    (
        [0] => Array
            (
                [item] => Array
                    (
                        [] => Array //here no number
                            (
                                [title] => STEP 1 :  ...
                                [content] => <p>If you are eligible to graduate...

...
    [1] => Array
        (
            [item] => Array
                (
                    [13] => Array //here the number should be 0
                        (
                            [title] => STEP 14 : CONVOCATION DRESS ..
                            [content] => <p>Here are the official...

Результат вы можете увидеть здесь: view-source: http://convo18.uum.my/

Пожалуйста, помогите. И мне было бы интересно узнать, есть ли у вас какое-нибудь элегантное решение для этой ситуации, помимо решения моей проблемы.

Спасибо за ваше время.

=============================================== ==========================

ОБНОВЛЕНИЕ: Спасибо @NigelRen за предложение, вот код, который работает:

<?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) use (&$step, &$i) {

    $step[$i]['item'] = array();

    $node->filter('.sppb-addon-title')->each(function ($node) use (&$step, &$i) {

        $step[$i]['cat'] = $node->html();
    });


    $h = 0;
    $node->filter('.sppb-panel-heading > .sppb-panel-title')->each(function ($node) use (&$step, &$i, &$h) {

        $step[$i]['item'][$h++]['title'] = $node->html();
    });

    $h = 0;
    $node->filter('.sppb-panel-body .sppb-addon-content')->each(function ($node) use (&$step, &$i, &$h)  {

        $step[$i]['item'][$h++]['content'] = $node->html();
    });

    $i++;

});

print_r($step);

1 Ответ

0 голосов
/ 28 июня 2018

Только что протестировал фиктивную настройку, и я думаю, что решение состоит в том, чтобы определить $j и $h вне любой вложенной функции. Причина в том, что они не определены в глобальной области видимости, поэтому, когда вы говорите global $step, $i, $j;, а затем $j++, это примет его как неопределенный в первый раз, а затем постинкремент установит его в 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;

Edit: Хотя, согласно моему первоначальному комментарию, global обычно хмурится, это усложняет тестирование и также (как было обнаружено) может работать не так, как вы ожидаете. Предлагаемый метод - использовать формат метода function(...) use(...) {, поэтому в примере ...

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

$a();
$a();
...