我有一个递归打开HTML页面并提取文章的函数。执行该函数后,返回的数组为NULL,但我之间的跟踪步骤表明该数组实际上包含元素。我相信在返回数组后它会重置。
为什么数组在函数中包含元素但返回后为NULL?
这是功能(简化):
function get_content($id,$page=1){
global $content; // store content in a global variable so we can use this function recursively
// If $page > 1 : we are in recursion
// If $page = 1 : we are just starting
if ($page==1) {
$content = array();
}
$html = $this->open($id,$page)) {
$content = array_merge($content, $this->extract_content($html));
$count = count($content);
echo("We now have {$count} articles total.");
if($this->has_more($html)) {
$this->get_content($id,$page+1);
} else {
$count = count($content);
echo("Finished. Found {$count} articles total. Returning results.");
return $content;
}
}
这就是我调用函数的方式:
$x = new Extractor();
$articles = $x->get_content(1991);
var_export($articles);
此函数调用将输出如下内容:
We now have 15 articles total.
We now have 30 articles total.
We now have 41 articles total.
Finished. Found 41 articles total. Returning results.
NULL
为什么数组在函数中包含元素但返回后为NULL?
答案 0 :(得分:3)
尝试return $this->get_content($id,$page+1);
而不是仅仅调用该函数。
如果你只是在没有返回的情况下调用该函数,那么“初始调用”将不会返回任何内容,并且随后的函数调用将返回返回值。
答案 1 :(得分:0)
如果尚未完成,请尝试在第一次函数调用之前声明$ content。
答案 2 :(得分:0)
不要使用全局变量。特别是如果它仅仅是为了递归。
function get_content($id,$page=1, $content = array()){
$html = $this->open($id,$page));
$content = array_merge($content, $this->extract_content($html));
if($this->has_more($html)) {
return $this->get_content($id,$page+1, $content);
} else {
return $content;
}
}
请注意,我删除了所有调试输出。