54

CSV ファイルを取得し、ヘッダーをキーとして連想配列を作成する方法について、数多くの例を見てきました。

例えば:

Brand,Model,Part,Test
Honda,Civic,123,244
Honda,Civic,135,434
Toyota,Supra,511,664

ブランド、モデル、パーツ、テストなどの配列を作成する場所 Array[$num][$key]$key

したがって、テスト値「434」にアクセスしたい場合は、配列内のすべてのインデックスをループして、ホンダ以外のブランドやシビック以外のモデルを無視する必要があります。


私がする必要があるのは、各 $num インデックスを通過する for ループを実行するのではなく、最も直接的に値にアクセスすることです。値テスト「434」にアクセスできるようにしたい:

Array['Honda']['Civic']['135']

または、ホンダが持っているすべてのモデルをループして for ステートメントを制御します...次のようなもの

foreach $model in Array['Honda']

少なくとも、既知のブランドが与えられたすべてのモデルを調べて、それぞれのすべての関連情報にアクセスできる必要があります。

編集:

これを例として設定していたことを確認するためです。私の実際のデータには、次のようなヘッダーがあります。

brand model part price shipping description footnote

そのうち、パーツに関連するすべての情報 (価格、送料、説明、脚注) にアクセスする必要があります。

4

7 に答える 7

71

csv ファイルを 1 行ずつ実行し、次のように配列に挿入します。

$array = $fields = array(); $i = 0;
$handle = @fopen("file.csv", "r");
if ($handle) {
    while (($row = fgetcsv($handle, 4096)) !== false) {
        if (empty($fields)) {
            $fields = $row;
            continue;
        }
        foreach ($row as $k=>$value) {
            $array[$i][$fields[$k]] = $value;
        }
        $i++;
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}
于 2011-01-26T06:39:25.877 に答える
21

連想リスト配列を作成するには、次のようなものを使用します。

$keys = fgetcsv($f);
while (!feof($f)) {
    $array[] = array_combine($keys, fgetcsv($f));
}

特定の属性でトラバースしてフィルタリングするには、次のような関数を記述します。

function find($find) {
    foreach ($array as $row) {
         if (array_intersect_assoc($row, $find) == $find) {
             $result[] = $row;
         }
    }
}

$find = array(Brand=>Honda, Model=>Civic, Part=>135)検索されたモデルを除外するために呼び出す場所。「Test」属性にのみアクセスしたい場合を除き、他の位置配列構造はあまり機能しないようです。

于 2011-01-26T06:46:29.133 に答える
4

この単純なアルゴリズムを試してください:

        $assocData = array();

        if( ($handle = fopen( $importedCSVFile, "r")) !== FALSE) {
            $rowCounter = 0;
            while (($rowData = fgetcsv($handle, 0, ",")) !== FALSE) {
                if( 0 === $rowCounter) {
                    $headerRecord = $rowData;
                } else {
                    foreach( $rowData as $key => $value) {
                        $assocData[ $rowCounter - 1][ $headerRecord[ $key] ] = $value;  
                    }
                }
                $rowCounter++;
            }
            fclose($handle);
        }

        var_dump( $assocData);
于 2012-01-14T11:52:20.830 に答える
2

ローカル ファイルまたは URL を指定することで機能するソリューションを次に示します。関連付けのオンとオフを切り替えることもできます。うまくいけば、これが役に立ちます。

class CSVData{
    public $file;
    public $data;
    public $fp;
    public $caption=true;
    public function CSVData($file=''){
        if ($file!='') getData($file);
    }
    function getData($file){
        if (strpos($file, 'tp://')!==false){
            copy ($file, '/tmp/csvdata.csv');
            if ($this->fp=fopen('/tmp/csvdata.csv', 'r')!==FALSE){
                $this->readCSV();
                unlink('tmp/csvdata.csv');
            }
        } else {
            $this->fp=fopen($file, 'r');
            $this->readCSV();
        }
        fclose($this->fp);
    }
    private function readCSV(){
        if ($this->caption==true){
            if (($captions=fgetcsv($this->fp, 1000, ","))==false) return false;
        }
        $row=0;
        while (($data = fgetcsv($this->fp, 1000, ",")) !== FALSE) {
            for ($c=0; $c < count($data); $c++) {
                $this->data[$row][$c]=$data[$c];
                if ($this->caption==true){
                    $this->data[$row][$captions[$c]]=$data[$c];
                }
            }
            $row++;
        }
    }
}

この使い方を試してください:

$o=new CSVData();
$o->getData('/home/site/datafile.csv');
$data=$o->data;
print_r($data);
于 2011-04-25T04:44:44.500 に答える
0

これが私の解決策です。他の人が述べたのと同様ですが、fgetcsvでwhileループを使用し、カウンターとarray_combineを使用して最初の行をキーとして設定します。

    $rownum = 0;
    while (($row = fgetcsv($openedFile, 1000, ',')) !== FALSE) {
        if ($rownum > 0) {
            $row = array_combine($importarray[0], $row);
        }
        array_push($importarray, $row);
        $rownum++;
    }
    array_shift($importarray);
于 2021-09-08T21:50:59.153 に答える