当我运行此代码时,它显示两个错误,第一个是Undefined变量:item,第二个错误是为foreach()提供的无效参数。我尝试将一个空数组作为项目。结果,第一个通知被删除,但第二个仍然出现。 foreach()中无效参数的问题是什么?
include_once('../../simple_html_dom.php');
function scraping_digg() {
// create HTML DOM
$html = file_get_html('http://digg.com/');
// get news block
foreach($html->find('div.news-summary') as $article) {
// get title
$item['title'] = trim($article->find('h3', 0)->plaintext);
// get details
$item['details'] = trim($article->find('p', 0)->plaintext);
// get intro
$item['diggs'] = trim($article->find('li a strong', 0)->plaintext);
$ret[] = $item;
}
// clean up memory
$html->clear();
unset($html);
return $ret;
}
// "http://digg.com" will check user_agent header...
ini_set('user_agent', 'My-Application/2.5');
$ret = scraping_digg();
foreach($ret as $v) {
echo $v['title'].'<br>';
echo '<ul>';
echo '<li>'.$v['details'].'</li>';
echo '<li>Diggs: '.$v['diggs'].'</li>';
echo '</ul>';
}
答案 0 :(得分:0)
在数组中构建项目时,请预先声明数组。其次,你的函数会在中途返回一个值,因此函数调用之后的foreach无法使用。
function scraping_digg() {
// create HTML DOM
$html = file_get_html('http://digg.com/');
$ret = [];
// get news block
foreach($html->find('div.news-summary') as $article) {
$item = [];
// get title
$item['title'] = trim($article->find('h3', 0)->plaintext);
// get details
$item['details'] = trim($article->find('p', 0)->plaintext);
// get intro
$item['diggs'] = trim($article->find('li a strong', 0)->plaintext);
$ret[] = $item;
}
// clean up memory
$html->clear();
unset($html);
return $ret;
}
答案 1 :(得分:0)
你有一些错误,需要调试它。我将通过我的思考过程,希望你能找到更好的策略来推理你的代码。
您有两个错误。让我们看一下第一个引发的问题,因为PHP首先遇到了这个问题而且问题可能导致了第二个问题:
未定义的变量:item
你在哪里提到$item
?你做过像$item['title'] = trim($article->find('h3', 0)->plaintext);
这样的事情,但逻辑上 - 给它分配一个新值不会有问题,因为PHP不需要需要变量的值。它必须是别的东西。
你也做过$ret[] = $item;
。好,太棒了。如果没有定义$item
,那么PHP会因为无法以合理的结果实际完成操作而吓坏了。
问题是为什么在$item
期间$ret[] = $item;
会被取消定义?显然,你已经完成了$item['title'] = 'whatever'
...?好。如果该代码从未执行会发生什么?如果$html->find('div.news-summary')
返回一些0长度数组,则foreach
循环的内容永远不会执行。
所以它是: $html->find('div.news-summary')
没有做你认为它正在做的事情。也许页面上没有div.new-summary元素?我不知道,但你应该调查一下。
让我们继续讨论第二个错误:
为foreach()提供的参数无效
此错误显示在第二位,因此我们知道 $ret[] = $item;
之后发生了。发生后唯一的foreach
循环是
foreach($ret as $v) {
echo $v['title'].'<br>';
echo '<ul>';
echo '<li>'.$v['details'].'</li>';
echo '<li>Diggs: '.$v['diggs'].'</li>';
echo '</ul>';
}
听起来$ret
并不像你想象的那样。您已将$ret
分配给scrapping_digg()
的返回值,但 返回的是什么?很明显,获取scrapping_digg()
的返回值与第一个错误$ret[]=$item
的原因之间存在问题。问题是你从未真正归还过任何东西。 PHP需要在函数上明确地调用return
。 您需要return $ret
。
function scraping_digg() {
// ...
// clean up memory
$html->clear();
unset($html);
$ret[] = $item;\
return $ret;
}
// ...
如果您需要查看执行期间的变量(并且您完全应该这样做),可以在其上调用var_dump()
。这是调试时的关键功能。
$array = $html->find('div.news-summary')
var_dump($array)
array() (0); //Maybe. Or maybe something else.
一旦你对编程更加熟悉,你可能会考虑使用像xDebug这样的东西。