简单的PHP网页抓取脚本出错了

时间:2011-11-08 19:08:19

标签: php class function constructor web-scraping

我对编程非常陌生,并且一直在试图让这个网络刮板工作2天。我简化了完整的脚本(甚至删除了所有实际的网页抓取),同时保持了原有的功能障碍。

我想代码很容易理解为受过训练的眼睛,但为了方便我会说脚本应该是:

  1. 使用子数组填充数组
  2. 将一些值设置到每个子数组中,但将最后一个子数组值保留为空
  3. a)使用另一个函数获取最后一个子数组值,然后按3. b)然后将它们插入到原始数组中
  4. 3.b是脚本失败的地方。它没有输入值(它留空)。

    我知道我正在使用没有参数的函数(完整代码包含它们),这些函数可能很糟糕,但如果没有它们,功能障碍仍然是相同的。

    <?php
        $scrape = new Scraper();
    
        class Scraper
        {
            protected $cars = array();
    
            function __construct()
            {
                $this->getcars();
    
                foreach ($this->cars as $item) {
                    $item['color'] = $this->getcolor($item); // here is the fault!
                }
            }
    
            private function getcars()
            {
                $listofcars = array('0','1','2');
                foreach ($listofcars as $item) {
                    $this->cars[] = array('carname' => 'humvee','color' => '');
                }
            }
    
            private function getcolor()
            {
                return 'green';
            }
        }
    ?>
    

2 个答案:

答案 0 :(得分:1)

您的foreach循环未通过引用传递(您所做的任何更改都不会“粘住”)。将其更改为:

foreach ($this->cars as &$item)

修改$this->getcolor($item);似乎也是一个问题。您定义的getcolor()函数不带参数,因此您可能想要$this->getcolor();

答案 1 :(得分:0)

通过引用传递的解决方案有效,但您也可以尝试:

<?php
    function __construct() {
        $this->cars = $this->getcars();
        foreach ($this->cars as $item) {
            $item['color'] = $this->getcolor($item);
        }
    }

    private function getcars() {
        $data = array();
        $listofcars = array('0','1','2');
        foreach ($listofcars as $item) {
            $data[] = array('carname' => 'humvee','color' => '');
        }
        return $data;
    }

    private function getcolor() {
        return 'green';
    }
?>