вывод и вызов массива из функции класса (RollingCurl) - PullRequest
0 голосов
/ 30 октября 2018

Извините, пожалуйста, мой английский.

Я использую Rollingcurl для сканирования различных страниц.

Rollingcurl: https://github.com/LionsAd/rolling-curl

Мой класс:

<?php

class Imdb
{

    private $release;
    public function __construct()
    {
        $this->release = "";
    }

    // SEARCH
    public static function most_popular($response, $info)
    {

        $doc = new DOMDocument();

        libxml_use_internal_errors(true); //disable libxml errors

        if (!empty($response)) {
            //if any html is actually returned

            $doc->loadHTML($response);
            libxml_clear_errors(); //remove errors for yucky html

            $xpath = new DOMXPath($doc);

            //get all the h2's with an id
            $row   = $xpath->query("//div[contains(@class, 'lister-item-image') and contains(@class, 'float-left')]/a/@href");
            $nexts = $xpath->query("//a[contains(@class, 'lister-page-next') and contains(@class, 'next-page')]");
            $names = $xpath->query('//img[@class="loadlate"]');

            // NEXT URL - ONE TIME
            $Count    = 0;
            $next_url = "";
            foreach ($nexts as $next) {

                $Count++;
                if ($Count == 1) {
                    /*echo "Next URL: " . $next->getAttribute('href') . "<br/>";*/

                    $next_link = $next->getAttribute('href');
                }
            }

            // RELEASE NAME
            $rls_name = "";
            foreach ($names as $name) {
                $rls_name .= $name->getAttribute('alt');
            }

            // IMDB TT0000000 RLEASE
            if ($row->length > 0) {
                $link = "";
                foreach ($row as $row) {
                    $tt_info .= @get_match('/tt\\d{7}/is', $doc->saveHtml($row), 0);
                }
            }

        }
        $array = array(
            $next_link,
            $rls_name,
            $tt_info,
        );
        return ($array);
    }
}

Выход / Возврат:

$array = array(
    $next_link,
    $rls_name,
    $tt_info,
);
return ($array);

Звоните:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

function get_match($regex, $content, $pos = 1)
{
    /* do your job */
    preg_match($regex, $content, $matches);
    /* return our result */
    return $matches[intval($pos)];
}

require "RollingCurl.php";
require "imdb_class.php";
$imdb = new Imdb;

if (isset($_GET['action']) || isset($_POST['action'])) {
    $action = (isset($_GET['action'])) ? $_GET['action'] : $_POST['action'];
} else {
    $action = "";
}

echo "  2222<br /><br />";


if ($action == "most_popular") {

    $popular = '&num_votes=1000,&production_status=released&groups=top_1000&sort=moviemeter,asc&count=40&start=1';

    if (isset($_GET['date'])) {
        $link = "https://www.imdb.com/search/title?title_type=feature,tv_movie&release_date=,".$_GET['date'].$popular;
    } else {
        $link = "https://www.imdb.com/search/title?title_type=feature,tv_movie&release_date=,2018".$popular;
    }

    $urls            = array($link);
    $rc              = new RollingCurl([$imdb, 'most_popular']); //[$imdb, 'most_popular']
    $rc->window_size = 20;
    foreach ($urls as $url) {
        $request = new RollingCurlRequest($url);
        $rc->add($request);
    }
    $stream = $rc->execute();
}

Если я выведу все как "эхо" в классе, все также отображается. Однако я хочу назвать все по отдельности.

Если я сейчас попытаюсь вывести его так, это не сработает.

$stream[0]
$stream[1]
$stream[3]

Кто-нибудь знает, как это может работать? Заранее большое спасибо.

1 Ответ

0 голосов
/ 30 октября 2018

RollingCurl ничего не делает с возвращаемым значением обратного вызова и не возвращает его вызывающей стороне. $rc->execute() просто возвращает true, когда есть функция обратного вызова. Если вы хотите что-то сохранить, вам нужно сделать это в самой функции обратного вызова.

Вы должны сделать most_popular нестатической функцией и присвоить ей свойство $results, которое вы инициализируете для [] в конструкторе. Тогда это может сделать:

$this->results[] = $array;

После того, как вы сделаете

$rc->execute();

Вы можете сделать:

foreach ($imdb->results as $result) {
    echo "Release name: $result[1]<br>TT Info: $result[2]<br>";
}

Было бы лучше, если бы вы помещали данные, извлеченные из документа, в массивы, а не в сцепленные строки, например

$this->$rls_names = [];
foreach ($names as $name) {
    $this->$rls_names[] = $name->getAttribute('alt');
}

$this->$tt_infos = [];
foreach ($rows as $row) {
    $this->$tt_infos[] = @get_match('/tt\\d{7}/is', $doc->saveHtml($row), 0);
}

$this->next_link = $next[0]->getAttribute('href'); // no need for a loop to get the first element of an array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...