Foreach通过一个范围来操作url,以便从实时CSV文件中获取数据


Foreach through a range to manipulating a url for fetching data from a live CSV file

我正在使用一些类从纳斯达克检索公司信息。根据给定的字母获取公司信息。所有的工作都是这样的,我可以通过给出字母和数字来获取业务,但是如果我试图设置一个范围,并通过foreach语句的字母,唯一可以检索的是第一个字母的信息。

class Finance {

public static $companyList = array();
public static function getCompaniesByLetter($letter = null,$number = null) {
    if ($letter && $number) {
        $letter = trim(strtoupper($letter));
        $companyList = 'http://www.nasdaq.com/screening/companies-by-name.aspx?letter='.$letter.'&render=download';
        if (@file_get_contents($companyList)) {
            self::$companyList = null;
            $csv = trim(str_replace('"Symbol","Name","LastSale","MarketCap","ADR TSO","IPOyear","Sector","industry","Summary Quote",', '', file_get_contents($companyList)));
            time_nanosleep(0, 300000000);
            $csv = file_put_contents('tmpcompanylist.csv', $csv);
            $file = fopen('tmpcompanylist.csv', 'r');
            $i = 0;
            while (!feof($file) && $i < $number) {
                $line = fgets($file);
                $line = str_replace('"', '', $line);
                $companyInfo = explode(',', $line);
                $removeThisNumber = floatval($companyInfo[2]);
                if (!$removeThisNumber) {
                    $sector = 7;
                    $industry = 8;
                } else {
                    $sector = 6;
                    $industry = 7;
                }
                $clearCompanyName = str_replace($removeThisNumber, '', $companyInfo[2]);
                $companyName = $companyInfo[1].$clearCompanyName;
                self::$companyList[] = array(
                    'symbol' => $companyInfo[0],
                    'name' => $companyName,
                    'sector' => $companyInfo[$sector],
                    'industry' => $companyInfo[$industry]
                    );
                $i++;
            }
            fclose($file);
            return true;
        }
        return false;
    }
    return false;
}

//This method will insert the companyinformation in database
public function insertCompaniesByLetter($range = array(),$number = null) {
    if (is_array($range) && $number && count($range == 2)) {
        $range = range($range[0], $range[1]);
        foreach ($range as $letter) {
            if (self::getCompaniesByLetter($letter,$number)) {
                foreach (self::$companyList as $company => $data) {
                    echo ($data['symbol']).'<br />';
                    echo ($data['name']).'<br />';
                    echo ($data['sector']).'<br />';
                }
                return true;
            }
        }
    }
    return false;
}
}

获取公司的方法是这样的:

Finance::insertCompaniesByLetter(array('A','D'),'10');

但是由于某些原因,结果是不需要的:

Array
(
[0] => Array
    (
        [symbol] => PIH
        [name] => 1347 Property Insurance Holdings Inc.
        [sector] => n/a
        [industry] => n/a
    )
[1] => Array
    (
        [symbol] => FLWS
        [name] => 1-800 FLOWERS.COM Inc.
        [sector] => Consumer Services
        [industry] => Other Specialty Stores
    )
[2] => Array
    (
        [symbol] => FCTY
        [name] => 1st Century Bancshares Inc
        [sector] => Finance
        [industry] => Major Banks
    )
[3] => Array
    (
        [symbol] => FCCY
        [name] => 1st Constitution Bancorp (NJ)
        [sector] => Finance
        [industry] => Savings Institutions
    )
[4] => Array
    (
        [symbol] => SRCE
        [name] => 1st Source Corporation
        [sector] => Finance
        [industry] => Major Banks
    )
[5] => Array
    (
        [symbol] => FUBC
        [name] => 1st United Bancorp Inc. (FL)
        [sector] => Finance
        [industry] => Major Banks
    )
[6] => Array
    (
        [symbol] => VNET
        [name] => 21Vianet Group Inc.
        [sector] => Technology
        [industry] => Computer Software: Programming
    )
[7] => Array
    (
        [symbol] => XXII
        [name] => 22nd Century Group Inc
        [sector] => Consumer Non-Durables
        [industry] => Farming/Seeds/Milling
    )
[8] => Array
    (
        [symbol] => DDD
        [name] => 3D Systems Corporation
        [sector] => Technology
        [industry] => Computer Software: Prepackaged Software
    )
[9] => Array
    (
        [symbol] => MMM
        [name] => 3M Company
        [sector] => Health Care
        [industry] => Medical/Dental Instruments
    )
)

我重写了insertcompanyesbyrange()方法,现在它可以工作了。它看起来是这样的:

public function insertCompaniesByRange($letters = array(), $number = null) {
    if (is_array($letters) && $number && count($letters) == 2) {
        $range = range($letters[0], $letters[1]);
        foreach ($range as $letter) {
            if ($this->getCompaniesByLetter($letter,$number)) {
                foreach($this->companyList as $company) {
                    $this->insertCompany($company);
                }
            }
        }
    }
    return false;
}