Php CSV到关联数组
我已经看到了许多关于如何获取CSV文件,然后创建以标题作为键的关联数组的示例 例如:Php CSV到关联数组,php,arrays,csv,associative,Php,Arrays,Csv,Associative,我已经看到了许多关于如何获取CSV文件,然后创建以标题作为键的关联数组的示例 例如: Brand,Model,Part,Test Honda,Civic,123,244 Honda,Civic,135,434 Toyota,Supra,511,664 它将在其中创建一个数组,例如数组[$num][$key],其中$key将是品牌、型号、零件、测试 因此,如果我想访问测试值“434”,我必须循环数组中的每个索引,然后忽略任何不是本田的品牌,以及任何不是思域的车型 我需要做的是最直接地访问值,而
Brand,Model,Part,Test
Honda,Civic,123,244
Honda,Civic,135,434
Toyota,Supra,511,664
它将在其中创建一个数组,例如数组[$num][$key]
,其中$key
将是品牌、型号、零件、测试
因此,如果我想访问测试值“434”,我必须循环数组中的每个索引,然后忽略任何不是本田的品牌,以及任何不是思域的车型
我需要做的是最直接地访问值,而不是通过遍历每个$num索引的for循环运行。我希望能够通过以下方式访问值测试“434”:
Array['Honda']['Civic']['135']
或者控制一个for语句,循环遍历本田的每一款车型。。。差不多
foreach$model数组['Honda']
至少我需要能够通过每一个已知品牌的模型,并访问每个模型的所有相关信息
编辑:
我只是想确认一下,我是在树立一个榜样。实际上,我的数据有如下标题:
品牌型号零件价格装运说明脚注
其中我需要访问与零件相关的所有信息(价格、装运、描述、脚注)逐行运行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);
}
要创建关联列表数组,请使用以下方法:
$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(品牌=>Honda,车型=>Civic,零件=>135)
调用它来过滤搜索到的车型。另一个位置数组结构似乎不太可行,除非您只想访问“Test”属性。下面是一个通过指定本地文件或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++;
}
}
}
尝试以下简单算法:
$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);
太多冗长的解决方案。我总是发现这是最简单的:
<?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);
}
?>
使用fgetcsv()
似乎是这项工作最直接、最明智的工具
csv.csv内容:
Brand,Model,Part,Test
Honda,Civic,123,244
Honda,Civic,135,434
Toyota,Supra,511,664
代码:
资源:如果要更改$array[$i][$k]=$value;到$array[$i][$fields[$k]]=$value;你会得到标题作为关键。在我看到他的评论之前,我正要说与@CraigHooghiem相同的话。对于
$fields[$k]
,上述答案与预期一样有效。如果标题行值周围存在空格,您可以使用$fields=array\u map('trim',$row')清除代码>奇妙的代码,它与逗号分隔的csv一起工作非常好。但是如果它是一个分号分隔的csv呢?我找不到用分号分隔的csv进行相同操作的方法。@Alex,除了讨论首字母缩写csv的语义是逗号分隔值
,您还可以设置函数的分隔符。我希望这有帮助!如果要将参数(如分隔符)传递给str_getcsv,请使用以下命令:$rows=array_map(function($row){return str_getcsv($row,;');},file('file.csv')
@marcovtwout,请记住,您可以将其他参数作为的第三个参数传递。此解决方案可能非常占用内存,因为它创建了一个包含整个CSV文件的数组,而不是将单行读入内存。此答案缺少教育性解释。
Brand,Model,Part,Test
Honda,Civic,123,244
Honda,Civic,135,434
Toyota,Supra,511,664
$assoc_array = [];
if (($handle = fopen("csv.csv", "r")) !== false) { // open for reading
if (($data = fgetcsv($handle, 1000, ",")) !== false) { // extract header data
$keys = $data; // save as keys
}
while (($data = fgetcsv($handle, 1000, ",")) !== false) { // loop remaining rows of data
$assoc_array[] = array_combine($keys, $data); // push associative subarrays
}
fclose($handle); // close when done
}
echo "<pre>";
var_export($assoc_array); // print to screen
echo "</pre>";
array (
0 =>
array (
'Brand' => 'Honda',
'Model' => 'Civic',
'Part' => '123',
'Test' => '244',
),
1 =>
array (
'Brand' => 'Honda',
'Model' => 'Civic',
'Part' => '135',
'Test' => '434',
),
2 =>
array (
'Brand' => 'Toyota',
'Model' => 'Supra',
'Part' => '511',
'Test' => '664',
),
)