输入CSV到阵列分配键

时间:2016-01-09 00:24:19

标签: php arrays csv import

这很有效。它是一种通用的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;}
?>

1 个答案:

答案 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文件转换为更多可用数组而量身定做的。