nasıl php bir döngü döngü için?

6 Cevap

döngü için bir yol php bir döngü var mı?

ben örneğin bir işlevi var ise, ki ben döngü bu fonksiyon sonsuz kere?

PHP6 goto var. ama u bu PHP5'ta nasıl yaparsın?

function getLinks($link) {
    // step 1: if $link got links, add them in a array
    // step 2: iterate array of links
    // step 3: save current link
    // step 4: check if current link got links, if it has, run $this->getLinks($link)
}

Adım 4'te i fonksiyon GetLinks kullanmak gerekir. Ve ben her bağlantıyı tarar ve onları kurtarır bir tarayıcı yapmak istiyorum görebilirsiniz.

Birisi, benzer bir şey yapmadım döngü / sürün bağlantıları bütün seviyelerini denedi?

i burada Goto işlevi gerekir düşünüyorum ama php 5 bunu gerçekleştirmek için bir yol var?

i ... teşekkür peşin ben bunu nasıl hiçbir fikrim yok!

6 Cevap

Eğer yorum yazdı ne yapabilirdi:

function getLinks($link) {
    step 1: Parse the page and get the list of links ==> $listLinks
    loop - step 2: iterate over $listLinks (currLink = $currLink)
        step 3: $globalListOfLinks[count($globalListOfLinks)] = $currLink
        step 4: $this->getLinks($link);
    end loop;
}

Tabii ki recursions sayısına bakmak zorunda, size de bir derinlik değişken var ve $ link ile birlikte o geçebileceği, çok özyineleme, bu yüzden olamaz. Eğer> biraz derinlik, dönmek;

Evet, bu mümkün. Eğer yöntemi same yöntemi inside arıyorsanız, size 'aksi takdirde, recursion . One of the big things to remember about recursive loops is to ensure you add a base case döngü durdurmak için kullanıyor ll sürekli döngü ve bu iyi değil.

Ben özyinelemeli yolu, havai onun bir sürü gidiyor ve son çare olmalı değil öneririz. Bir while döngü kullanarak benzer sonuçlar elde edilmelidir.

Onun adı verilen bir özyinelemeli işlev (sadece fonksiyonun bedende yeniden işlevini çağırın). Eğer bir tarayıcı bina konum Ancak, ben iyi kalpli olmak dikkatli olurdu. Eğer kontrol edebilirsiniz http://www.robotstxt.org/. Aynı etki istekleri arasındaki zaman miktarı gibi şeyler sahipleri robots.txt dosyası ile sınırlı olabilir. Eğer iyi davranır yoksa, birçok sys yöneticileri tarafından yasaklı alabilirsiniz.

Gibi bir şey ...

function stuff($link,$links=Array()){
  if (($contents=@file_get_contents($link))!==false){
    preg_match_all('@https?://[^"\'}{\[\]<>\s]{3,255}@i',$contents,$linkDump);
    $links=array_merge($links,$linkDump[0]);
  }
  stuff(array_shift($links),$links);
}
stuff('http://www.foxnews.com/'); //packet them all you want while testing ;)

yerine recurse daha fazla bağlantılar, orada muhtemelen kadar iyi kıvırmak sınıfını kullanın ve geri çağrılarla ayrıştırmak. Sen, js, resim vb css filtre ve tekrar tekrar aynı bağlantıları yapmazsanız emin olmak gerekir. file_get_contents aptal ama iyi çünkü beni o kısa el ve hala işlevsel yazabilirsiniz.

Ben bu görevi gerçekleştirmek için bir goto gerek olduğunu sanmıyorum. Bilgiç olmak için, bir goto gerekmez. Hiç! Böhm-Jacopini :)

Maybe with a bit of code I would be more precise but, assuming that $links is an url and that you have a function called harvestPage that get the url of a page and return an array with all the links (urls) it contains you don't have to resort to recursion neither. A pipe (FIFO) will be sufficent:

function getLinks($link) {
 $linksToCrawl = harvestPage($links)
  while (count($linksToCrawl)) {
    $currentLink = array_shift($linksToCrawl);
    save($CurrentLink);
    $linksToCrawl = array_merge($linksToCrawl, harvestPage($currentLink));
  }
}

Siz de döngüsel başvurular için kontrol edin (ve belki robot.txt çok :)) gerektiğini unutmayın.

Yerine while() döngü kullanın ve break çıkmak.

while(1)
{
  ....
};