php foreach问题

时间:2011-07-15 12:56:37

标签: php dom

我正在使用simple_html_dom_helper,所以做一些屏幕抓取并遇到一些错误。

第二个foreach运行4次(自sizeof($pages) == 4起),而它应该只运行一次。我从示例脚本中获取了此代码,其中table.result-liste在页面上多次出现。在我的情况下它只发生一次,所以imho没有必要foreach。 print_r($data)打印出相同的内容4次,并且没有必要。

进一步下来我试图在没有foreach的情况下做同样的事情,但它只打印出no,所以似乎有不同的反应,我不知道为什么。

foreach( $pages as $page )
        {
            $p = $this->create_url($codes[0], $price, $page); //pass page number along          
            $p_html = file_get_html($p);

            $row = $p_html->find("table[class=result-liste] tr");

            //RUNS OK BUT NO NEED TO DO IT FOUR TIMES.
            //CLASS RESULT-LISTE ONLY OCCURS ONCE ANYWAY
            foreach( $p_html->find("table[class=result-liste] tr") as $row)
            {
                //grab only rows where there is a link 
                if( $row->find('td a') )
                {
                    $d_price = $this->get_price($row->first_child());
                    $d_propid = $this->get_prop_id($row->outertext);

                    $data = array(
                        "price"     => $d_price,
                        "prop_id"   => $d_propid
                    );

                    print_r($data);
                }                                               
            }

            //MY ATTEMPT TO AVOID THE SECOND FOREACH DOES NOT WORK ...
            $row = $p_html->find("table[class=result-liste] tr");
            if( is_object($row) && $row->find('td a')) print "yes ";
            else print "no ";           
        }

2 个答案:

答案 0 :(得分:2)

即使table[class=result-liste]仅在页面上出现一次,此find语句也会查找作为表行的<tr>元素。因此,除非您的表只有一行,否则您需要foreach

$p_html->find("table[class=result-liste] tr")

答案 1 :(得分:0)

您的代码

        foreach( $p_html->find("table[class=result-liste] tr") as $row)
        {
            //grab only rows where there is a link 
            if( $row->find('td a') )
            {
                $d_price = $this->get_price($row->first_child());
                $d_propid = $this->get_prop_id($row->outertext);

                $data = array(
                    "price"     => $d_price,
                    "prop_id"   => $d_propid
                );

                print_r($data);
            }                                               
        }

将以上代码替换为MY代码

        $asRow = $p_html->find("table[class=result-liste] tr");
        $row = $asRow[0];

            //grab only rows where there is a link 
            if( $row->find('td a') )
            {
                $d_price = $this->get_price($row->first_child());
                $d_propid = $this->get_prop_id($row->outertext);

                $data = array(
                    "price"     => $d_price,
                    "prop_id"   => $d_propid
                );

                print_r($data);
            }                                               

试试这个。