如何防止foreach中的无效参数

时间:2017-11-12 16:04:07

标签: php curl foreach

当我运行此代码时,它显示两个错误,第一个是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>';
    }

2 个答案:

答案 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这样的东西。