PHP将stream_get_contents处理成一个数组

时间:2015-07-23 07:17:42

标签: php arrays

我在转换包含制表符分隔的CSV输出的字符串时遇到了麻烦 成阵列。使用以下代码时:

$data = stream_get_contents($request->getShipmentReport());

我收回数据如下:

Date    Shipped     Comments        Feedback    Arrived on Time
5/11/15 2       comment         response    Yes 

现在我想将这些数据处理成一个数组,其中返回的标题(第1行)作为索引,包含之后的每一行的值。

我想结束这样的事情:

$line['Date'] = 5/11/15
$line['Shipped'] = 2
$line['Feedback'] = response
$line['Arrived on Time']  yes

实现这一目标的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

我建议使用库来处理CSV,例如CSV-Package by The League of Extraordinary Packages

您可以传递数据并立即开始使用数组结构:

$csvString = stream_get_contents($request->getShipmentReport());
$csvReader = \League\Csv\Reader::createFromString($csvString);
$data = $csvReader->fetchAssoc(
    array('Date', 'Shipped', 'Comments', 'Feedback', 'Arrived on Time')
);
// Or since line 0 contains header
$data = $csvReader->fetchAssoc(0); // 0 is offset of dataset containing keys

现在你的数据应该是这样的结构:

$data = array(
    array(
        'Date' => '5/11/15',
        'Shipped' => '2',
        ...
    ),
    array(
        ...
    )
);

您甚至可以过滤掉特定的数据集和各种奇特的东西。只需查看我链接到的文档。

答案 1 :(得分:0)

联盟CSV阅读器给了我一个糟糕的结果。我改用它:

          $csvReportString = stream_get_contents($request->getReport());
          $csvReportRows = explode("\n", $csvReportString);
          $report = [];
          foreach ($csvReportRows as $c) {
            var_dump($c);
            if ($c) { $report[] = str_getcsv($c, "\t");}
          }
          var_dump($report);