我递归地调用一个函数,但它似乎没有工作

时间:2013-04-10 18:43:24

标签: php recursion web-crawler

我以递归方式调用crawl()函数来获取页面的内容并回显它。 当我从函数外部手动调用它时,它工作,但是当我从函数内部递归调用它时,我没有得到递归调用的输出。我得到的唯一输出来自一次手动调用。

为什么这不起作用,我做错了什么?

<?php
error_reporting( E_ERROR );

define( "CRAWL_LIMIT_PER_DOMAIN", 50 );

$domains = array();

$urls = array();

$dom = new DOMDocument();

$matches = array();

function crawl( $domObject, $url, $matchList )
{
    global $domains, $urls;
    $parse = parse_url( $url );
    $domains[ $parse['host'] ]++;
    $urls[] = $url;

    $content = file_get_contents( $url );
    if ( $content === FALSE ){
        return;
    } 
    echo  strip_tags($content) . "<br /><br /><br />";
        array_push($matchList, 'http://www.the-irf.com/hello/hello5.html');
        array_push($matchList, 'http://www.the-irf.com/hello/hello6.html');
        array_push($matchList, 'http://www.the-irf.com/hello/end.html');


    foreach( $matchList[0] as $crawled_url ) {
        $parse = parse_url( $crawled_url );
        if ( count( $domains[ $parse['host'] ] ) < CRAWL_LIMIT_PER_DOMAIN && !in_array( $crawled_url, $urls ) ) {
            sleep( 1 );
            crawl( $domObject, $crawled_url, $matchList );
        }
    }
}

crawl($dom, 'http://the-irf.com/hello/hello6.html', $matches);
?>

1 个答案:

答案 0 :(得分:2)

问题出在你使用foreach时。

foreach($matchList[0] as $crawled_url){

您的数组$matchList如下所示:array('http://www.the-irf.com/hello/hello5.html', 'http://www.the-irf.com/hello/hello6.html', 'http://www.the-irf.com/hello/end.html')

foreach期望第一个参数是一个数组。 $matchList[0]不是数组,而是字符串'http://www.the-irf.com/hello/hello5.html'

换句话说,如果您将该行更改为

foreach($matchList as $crawled_url){

你将开始递归调用该函数。