3 回答
TA贡献1815条经验 获得超13个赞
应该会轻松一些。不需要array_merge_recursive:
foreach($csv_data as $row) {
$key = array_pop($row);
if(!isset($data_for_email[$key])) {
$data_for_email[$key] = [];
}
$data_for_email[$key] = array_merge($data_for_email[$key], $row);
}
TA贡献1794条经验 获得超8个赞
更高的内存效率将是:
不读取内存中的整个文件。
fgetcsv
一次读取一行避免递归合并
代码:
$handle = fopen($f_name, 'r');
if (!$handle) {
// Your error-handling
die("Couldn't open file");
}
$data_for_email = array();
while($csvLine = fgetcsv($handle)) {
// Remove last element and make it a key
$le = array_pop($csvLine);
if (isset($data_for_email[$le])) {
$data_for_email[$le] = array_merge($data_for_email[$le], $csvLine);
} else {
$data_for_email[$le] = $csvLine;
}
}
fclose($handle);
TA贡献1155条经验 获得超0个赞
我也做了一些东西,但现在其他的更快了。:D 我已经做到了,它并没有完全符合您的要求,但也许它可以进一步帮助您。
不幸的是,我现在没有再进一步了,无论如何都想向您展示它:)
这是您的 index.php (或任何文件被调用。)
<?php
include "Data.php";
$f_name = 'in.csv';
// Stores all csv data
$csv_data = array_map('str_getcsv', file($f_name));
$c = count($csv_data);
$tmp = array();
$data_for_email = array();
foreach ($csv_data as $data){
$key = array_pop($data);
array_push($data_for_email,new Data($data,$key));
}
foreach ($data_for_email as $data){
array_push($tmp,$data->getValue());
}
foreach ($tmp as $value){
print_r($value);
echo "<br>";
}
这里是类数据:
<?php
class Data
{
private $value = [];
public function __construct($data, $key)
{
$this->value[$key]=$data;
}
/**
* @return array
*/
public function getValue()
{
return $this->value;
}
}
作为输出,你变成了这样的东西:
Array ( [sports] => Array ( [0] => tennis [1] => soccer ) )
Array ( [things] => Array ( [0] => car [1] => plane ) )
Array ( [things] => Array ( [0] => jeans [1] => shirt ) )
ps:当然还有另一个函数可以总结相同的键,但不知何故我现在什么都没找到......我希望它有帮助:)
- 3 回答
- 0 关注
- 156 浏览
添加回答
举报