我在转换包含制表符分隔的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
实现这一目标的最佳方式是什么?
答案 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);