在php中更快地解析数组


Faster parsing of array in php

我有一个包含40000行的CSV文件,我加载数组中的所有行,并使用此函数返回一个子数组,其中只有我需要的值。。。这是代码

<?php
//----------------------------------------------
function query_array($theArray,$theQuery,$col){
    $return = array();
    foreach($theArray as $subarray){
        if ($subarray[$col] == $theQuery) {
            $return[] = $subarray;
            }
    }
    return $return;
}
//----------------------------------------------
function parse_csv_file($csvfile) {
    $csvData = file_get_contents($csvfile);
    $lines = explode("'n", $csvData);
    $array = array();
    foreach ($lines as $line) {
        $array[] = str_getcsv($line);
    }
    return $array;
}
//----------------------------------------------
function echo_array($theArray) {
    $return = "";
    foreach ($theArray as $key => $value) {
        $result = implode(' ', $value);
        $return .= '(# '. $key .')-> '. $result .'<br/>';
    }
    return $return;
}
//----------------------------------------------
$starttime = microtime(TRUE);
$fileName = "the-path-to-my-file/PHOTOS.TXT";
$basename = basename($fileName);
$MyQuery = "8370336";
$myCol = 0;
echo 'Query : Find : '. $MyQuery . ' dans la collone : '. $myCol . ' du fichier : '. $basename .'<br/><br/>';
$outputArray = parse_csv_file($fileName);
$slimDownArray = query_array($outputArray, $MyQuery, $myCol);
echo echo_array($slimDownArray);
$endtime = microtime(TRUE);
$totaltime = $endtime - $starttime;
echo '<br/>Temp execution : '. round($totaltime,2) . ' second<br/>'."'n";
?>

因此,要从40000行csv中获得23个条目,需要1.7秒。。。问题是,我们能让它更快吗?,不到1秒?

对象或类方法会更好/更灵活,但这种方法应该比现有方法更快。我只是用常量做了几件事。$line的东西只有在你关心行号的情况下才会出现:

function query_csv($query, $col) {
    static $fp;
    if(!$fp) {
        $fp = fopen(CSV_NAME, 'r');
    }    
    $line = 0;
    $return = array();
    while(($data = fgetcsv($fp, 0, CSV_DELIM, CSV_ENC)) !== false) {
        if($data[$col] == $query) {
            //$return[$line] = $data; //if you want array keyed by line
            $return[] = $data;
        }
        $line++;
    }
    return $return;
}

最初不需要将所有行加载到一个数组中。只需在开始时构建"已筛选"数组。

$field_delimiter = ",";  // or "|" or any other delimiter
function parse($file_in) {
    $fh = fopen($file_in, "r");
    $data_arr = array();
    while (($line = fgetcsv($fh, 1024, $field_delimiter)) !== false) {
         //add data into your array in here;
         //anytime you want to skip a line of data, just use:  continue;
    }
    return $data_arr;
}