首页 > 解决方案 > 在 PHP 中过滤 CSV 文件,如 SQL

问题描述

我有一个包含多列的 CSV 文件,我想像使用 SQL 一样进行排序和过滤。

CSV 结构 -

Type  |  Vin  | DateInStock
New   |  675F |   12/06/19
Used  |  7643 |   12/05/19

etc..

这是我的 PHP 文件 -

$fh = fopen('myFile.csv', 'r');
while($line = fgetcsv($fh)) {
    $type[] = array($line[0]); 
    $vin[] = array($line[1]); 
    $date[] = array($line[2]); 
}

所以我通常会做的是

"SELECT * FROM table WHERE type = 'Used' AND date = '$todays_date'";

然后回显所有的 Vin 数字

$vin = $row['vin'];

我可以获得类型、vin 和 date 的数组,但不知道如何仅显示从今天开始的 vin 并且具有已使用的类型。我会怎么做才能做到这一点?我试过这个只是为了获得类型为 Used 的 vin 号码 -

  foreach($type as $t){
      $recall_type = $t[0];
      if($recall_type == 'Used'){
          foreach ( $vin as $value ){
              $recall_vin = $value[0];    
              $recall_vin.'<br>';
          } 
      } 
   }

但这只是数百次呼应相同的 vin 模式..

标签: phpcsvsortingfilterforeach

解决方案


我会将所有值读入一个多维数组;然后您可以array_filter根据您拥有的条件进行过滤。例如:

$fh       = fopen('myFile.csv', 'r');
$vehicles = array();
while($line = fgetcsv($fh)) {
    $vehicles[] = array(
                        'type' => $line[0], 
                        'vin'  => $line[1], 
                        'date' => $line[2]
                        );
}
// get today's date in a format to match the CSV
$today = date('m/d/y');
$vehicles = array_filter($vehicles, function ($v) use ($today) { 
    return $v['type'] == 'Used' && $v['date'] == $today;
});

3v4l.org 上的演示


推荐阅读