2011-10-15 197 views
0
function csv_data_to_zip_array($csv) 
{ 
    $f = fopen($csv, "r"); 
    $i= 0; 
    while($line= fgets($f)){ 
     $line = preg_replace("/[^0-9]/", "", $line); 
     if(is_numeric($line)&&strlen($line)==5){ // it is a zip code 
      $array[] = $line; 
     } 
     $i++; 
    } 
    fclose($f); 
    return $array; 
} 

這是我的功能,它將大量的csv與一堆郵政編碼一起讀入數組中。爲什麼我的函數返回NULL?

回答

1

這是什麼Ignacio said:要麼whileif總是返回假的,你應該初始化$array作爲while循環前的空數組反正。

以下是可能更快獲得結果的建議:如果CSV始終包含同一列中的郵政編碼,請改爲使用fgetcsv。然後您可以指定列號來檢查(is_numeric(substr($line[column_num],0,5))),而不是在整行上運行preg_replace

編輯

使用您從網站上張貼的樣本數據(我注意到,所有的數據文件中也出現在第一列的郵政編碼;一些文件有一個標題行和一些不),這函數訣竅:

function csv_data_to_zip_array($csv_path) { 
    $fd = fopen($csv_path,'r'); 
    $zipcodes = array(); 
    while ($columns = fgetcsv($fd)) { 
    if(is_numeric($columns[0])) { 
     $zipcodes[] = $columns[0]; 
    } 
    } 
    return $zipcodes; 
} 
+0

它不是真正的csv格式,只有文本文件重命名爲csv,因爲這是他們發送它們的方式。 idky – theprestig3

+0

此外,如果我回顯$行,郵政編碼打印。 – theprestig3

+0

@ theprestig3,你能否請確認你現在正在初始化'$ array'作爲'while循環之前的空數組? – imm

5

因爲沒有元素被添加到$array;您的一個條件(whileif)始終爲假。

順便說一句,你應該總是初始化非標量,但是這並不能解決你的問題。

+0

謝謝,我做了一個測試,並完全刪除if語句,數組仍然是NULL。它可能與fgets有關嗎? – theprestig3