CSV到关联数组

Par*_*roX 37 php csv arrays associative

我已经看过很多关于如何获取CSV文件然后创建一个以标题为关键字的关联数组的例子.

例如:

Brand,Model,Part,Test
Honda,Civic,123,244
Honda,Civic,135,434
Toyota,Supra,511,664
Run Code Online (Sandbox Code Playgroud)

它会创建一个Array,如 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

其中我需要访问与该部件相关的所有信息(价格,运输,desc,脚注)

Dae*_*rik 62

太长的解决方案.我总觉得这是最简单的:

<?php
    /* Map Rows and Loop Through Them */
    $rows   = array_map('str_getcsv', file('file.csv'));
    $header = array_shift($rows);
    $csv    = array();
    foreach($rows as $row) {
        $csv[] = array_combine($header, $row);
    }
?>
Run Code Online (Sandbox Code Playgroud)

  • @Alex,除了在首字母缩略词 CSV 上争论语义是“逗号分隔值”之外,您还可以设置 [str_getcsv](http://php.net/manual/en/function.str-getcsv.php) 的分隔符功能。我希望这有帮助! (4认同)
  • 如果要将参数(如分隔符)传递给str_getcsv,请使用:`$ rows = array_map(function($ row){return str_getcsv($ row,';');},file('file.csv' ));` (3认同)
  • 奇妙的代码,它适用于逗号分隔的 csv。但是如果它是一个分号分隔的 csv 呢?我没有找到用分号分隔的 csv 做同样的事情的方法。 (2认同)
  • @marcovwout,请记住,您可以将其他参数作为 [array_map()](http://php.net/manual/en/function.array-map.php) 的第三个参数传递。 (2认同)
  • 该解决方案可能会占用大量内存,因为它创建了一个包含整个CSV文件的数组,而不是将单行读取到内存中 (2认同)

Hai*_*vgi 59

逐行遍历csv文件,并插入到数组中:

$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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你要更改$ array [$ i] [$ k] = $ value; 到$ array [$ i] [$ fields [$ k]] = $ value; 你会得到标题作为关键. (14认同)
  • 在我看到他的评论之前,我正要和@CraigHooghiem 说同样的话。使用`$fields[$k]`,上述答案按预期工作。 (2认同)

mar*_*rio 18

要创建关联列表数组,请使用以下内容:

$keys = fgetcsv($f);
while (!feof($f)) {
    $array[] = array_combine($keys, fgetcsv($f));
}
Run Code Online (Sandbox Code Playgroud)

并通过特定属性遍历和过滤,编写如下函数:

function find($find) {
    foreach ($array as $row) {
         if (array_intersect_assoc($row, $find) == $find) {
             $result[] = $row;
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里调用它$find = array(Brand=>Honda, Model=>Civic, Part=>135)来过滤掉搜索到的模型.除非您只想访问"Test"属性,否则其他位置数组结构似乎不太可行.


Tom*_*ell 5

尝试这个简单的算法:

        $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);
Run Code Online (Sandbox Code Playgroud)