这很有效。它是一种通用的csv文件导入程序和密钥分配器。寻找反馈如何使这种方法更加优雅。我上周开始学习php。这个论坛太棒了。
<?php
$csvfilename = "sdb.csv";
$filekeys = array('SSID','EquipName','EquipTypeSignalName','elecpropID');
$records = InputCsvFile($csvfilename,$filekeys);
function InputCsvFile($filename,$filekeys){
$array1 = array_map('str_getcsv', file($filename));
foreach($array1 as $element){
$int1 = 0;
unset($array3);
foreach($filekeys as $key){
$array3[$key] = $element[$int1];
$int1++;}
$array2[] = $array3;}
return $array2;}
?>
答案 0 :(得分:3)
使用array_map()
很聪明,但由于你必须进一步处理每一行,所以有点不必要。我会像这样重写InputCsvFile
:
function InputCsvFile($filename, array $columns) {
$expectedCols = count($columns);
$arr = [];
// NOTE: Confirm the file actually exists before getting its contents
$rows = file($filename);
foreach($rows as $row) {
$row = str_getcsv($row);
if (count($row) == $expectedCols)) {
$arr[] = array_combine($filekeys, $element);
} else {
// Handle the column count mismatch. The test is required because
// otherwise, array_combine will complain loudly.
}
}
return $arr;
}
或者,由于您正在处理文件,因此您可以循环fgetcsv(),而不是使用file()
+ str_getcsv()
。使用fgetcsv()
将使用更少的内存(因为整个文件不必完全读入并在迭代期间保留在内存中),这可能是也可能不是一个问题,具体取决于您的文件大小
array_combine()(顺便提一下,这是我在PHP中最喜欢的函数之一)创建一个新数组,给定数组键(您的$filekeys
数组中的列列表)和值(处理过的行来自csv),实际上是为将csv文件转换为更多可用数组而量身定做的。