Как ввести значение вне функции - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу получить значение $ name вне функции, чтобы я мог переименовать файл zip вместе с ним, но как это сделать?

этот метод crawele, и я не могу использовать значение вне функции

<?php

require 'vendor/autoload.php';

use Symfony\Component\DomCrawler\Crawler;

$client = new \GuzzleHttp\Client();
// go get the date from url
$url = 'https://hentaifox.com/gallery/58118/';

$resnm = $client->request('GET', $url);

$htmlnm = ''.$resnm->getBody();

$crawler = new Crawler($html);

$res_name = $client->request('GET', $url);

$html_name = ''.$res_name->getBody();

$crawler_name = new Crawler($html_name);

$nameValues_name = $crawler_name->filter('.info > h1')->reduce(function (Crawler $node, $i){
    $name = $node->text();
    return $maname;
});

print_r($name);
$res = $client->request('GET', $url);

$html = ''.$res->getBody();

$crawler = new Crawler($html);

$nodeValues = $crawler->filter('.gallery .preview_thumb')->each(function (Crawler $node, $i) {
     $image = $node->filter('img')->attr('data-src');
     $imagerep = str_replace(array('//i2.hentaifox.com' , '//i.hentaifox.com','t.jpg'),array('https://i2.hentaifox.com','https://i2.hentaifox.com','.jpg'),$image);
     $zip = new ZipArchive();

     $my_save_dir = $name.'.zip';

     $zip->open($my_save_dir, ZipArchive::CREATE);

     $imgdownload = file_get_contents($imagerep);

     $zip->addFromString(basename($imagerep), $imgdownload);

     $zip->close();

});

помогите мне узнать значение $ name, чтобы использовать его для именования zip-файла в $ my_save_dir

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Если вы хотите использовать переменную извне, внутри вашей анонимной функции вам нужно сделать это следующим образом:

$nodeValues = $crawler->filter('.gallery .preview_thumb')
                      ->each(function (Crawler $node, $i) use ($name) {

Если вы также хотите иметь возможность доступа к любым изменениям в переменной, которые были сделаны внутри анонимной функции, вам нужно передать ее по ссылке :

$nodeValues = $crawler->filter('.gallery .preview_thumb')
                      ->each(function (Crawler $node, $i) use (&$name) {

Вы также можете объявить $name как переменную global, но это обычно считается плохой практикой, и вам всегда нужно отслеживать их.

0 голосов
/ 06 апреля 2019

анонимная функция может наследовать данные из окружающей ее области с помощью предложения use (см. Пример 3 по https://www.php.net/manual/en/functions.anonymous.php)

// $name has to be defined here.
$nodeValues = $crawler->filter('.gallery .preview_thumb')
                      ->each(function (Crawler $node, $i) use ($name) { // <-- the use
     //...
});

Однако у меня есть странное ощущение, что вы были бы намного лучшеВыключайте, если не используете анонимные функции все время, так как вы на самом деле не придерживаетесь принципов сокращения карты. Я думаю, это также будет работать проще и лучше:

foreach($crawler->filter('.gallery .preview_thumb') as $i => $node) {
    // it's the same scope now
    // do whatever ...
}

Однако, почему бы не открытьZip-файл вне цикла, и просто добавьте содержимое в цикл?!

...