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 關注
- 177 瀏覽
添加回答
舉報