2011-10-15 20 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です:どちらかwhileまたはifは常にfalseを返している、とあなたはとにかくそのwhileループの前に空の配列として$arrayを初期化する必要があります。

結果がより速くなる可能性があります。CSVに常に同じ列に郵便番号が含まれている場合は、代わりにfgetcsvを使用してください。行全体にpreg_replaceを実行するのではなく、チェックする列番号(is_numeric(substr($line[column_num],0,5)))を指定することができます。

編集:あなたのウェブサイトからの投稿のサンプルデータを使用して

(最初の列に郵便番号をそこに持っている中で、私はすべてのデータファイルを気づいた。いくつかのファイルは、ヘッダ行を持っているし、いくつかはそうではない)、この関数はそのトリックを行います:

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

また、$ lineをエコーすると、郵便番号が表示されます。 – theprestig3

+0

@ theprestig3、 'while'ループの前に' $ array'を空の配列として初期化していることを確認できますか? – imm

5

$arrayに要素が追加されていないため、いずれかの条件(whileif)は常にfalseです。

非スカラーを初期化する必要がありますが、ここでは問題は解決しません。

+0

ありがとう、私はテストを行い、if文を完全に削除し、配列はまだNULLです。それはfgetsと何か関係がありますか? – theprestig3

関連する問題