从一维数组创建关联数组

不太确定问题的标题应该在这里...


示例 .csv:


tennis,soccer,sports

car,plane,things

jeans,shirt,things

我的最终理想结果应该是一个如下所示的数组:


Array

(

    [sports] => Array

        (

            [0] => tennis

            [1] => soccer

        )


    [things] => Array

        (

            [0] => car

            [1] => plane

            [2] => jeans

            [3] => shirt

        )


)

这是我最近尝试实现上述结果(经过多次尝试):


<?php

$f_name = 'test.csv';

// Stores all csv data

$csv_data = array_map('str_getcsv', file($f_name));

$c = count($csv_data);


$tmp = array();

$data_for_email = array();


for ($i = 0; $i < $c; $i++) {

    // Remove last element and make it a key

    $le = array_pop($csv_data[$i]);

    $tmp[$le] = $csv_data[$i];

    $data_for_email = array_merge_recursive($data_for_email, $tmp); // MEMORY ERROR

}


print_r($data_for_email);

?>

这就是我得到的结果:


Array

(

    [sports] => Array

        (

            [0] => tennis

            [1] => soccer

            [2] => tennis

            [3] => soccer

            [4] => tennis

            [5] => soccer

        )


    [things] => Array

        (

            [0] => car

            [1] => plane

            [2] => jeans

            [3] => shirt

        )


)

如您所见,我在[sports]数组中得到了 .csv 的第 1 行的重复项。

我的要求的更详细描述:

  1. 每行有 3 个字段。

  2. 第三个字段成为key新关联数组中的 a。

  3. 其余两个字段(第1次和第2次)成为valueskey

  4. 因为多行可能(并且确实)包含相同的第三个字段(而第一个和第二个字段的组合总是不同的),所以我需要将所有这些重复键的值合并为 1。

PS我之后可以解析该数组(以删除重复值),但真正的.csv文件很大并且处理它变得太慢,并且在我标记的行中收到以下错误// MEMORY ERROR

致命错误:允许的内存大小为 134217728 字节已用尽

我尝试增加内存限制,但如果可能的话,我更愿意避免这种情况。


饮歌长啸
浏览 157回答 3
3回答

萧十郎

应该会轻松一些。不需要array_merge_recursive:foreach($csv_data as $row) {&nbsp; &nbsp; $key = array_pop($row);&nbsp; &nbsp; if(!isset($data_for_email[$key])) {&nbsp; &nbsp; &nbsp; &nbsp; $data_for_email[$key] = [];&nbsp; &nbsp; }&nbsp; &nbsp; $data_for_email[$key] = array_merge($data_for_email[$key], $row);}

幕布斯7119047

更高的内存效率将是:不读取内存中的整个文件。fgetcsv一次读取一行避免递归合并代码:$handle = fopen($f_name, 'r');if (!$handle) {&nbsp;&nbsp; &nbsp; // Your error-handling&nbsp; &nbsp; die("Couldn't open file");}$data_for_email = array();while($csvLine = fgetcsv($handle)) {&nbsp; &nbsp; // Remove last element and make it a key&nbsp; &nbsp; $le = array_pop($csvLine);&nbsp; &nbsp; if (isset($data_for_email[$le])) {&nbsp; &nbsp; &nbsp; &nbsp; $data_for_email[$le] = array_merge($data_for_email[$le], $csvLine);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; $data_for_email[$le] = $csvLine;&nbsp; &nbsp; }}fclose($handle);

白衣非少年

我也做了一些东西,但现在其他的更快了。:D 我已经做到了,它并没有完全符合您的要求,但也许它可以进一步帮助您。不幸的是,我现在没有再进一步了,无论如何都想向您展示它:)这是您的 index.php (或任何文件被调用。)<?phpinclude "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){&nbsp; &nbsp; $key = array_pop($data);&nbsp; &nbsp; array_push($data_for_email,new Data($data,$key));}foreach ($data_for_email as $data){&nbsp; &nbsp; array_push($tmp,$data->getValue());}foreach ($tmp as $value){&nbsp; &nbsp; print_r($value);&nbsp; &nbsp; echo "<br>";}这里是类数据:<?phpclass Data{&nbsp; &nbsp; private $value = [];&nbsp; &nbsp; public function __construct($data, $key)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $this->value[$key]=$data;&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* @return array&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public function getValue()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->value;&nbsp; &nbsp; }}作为输出,你变成了这样的东西:Array ( [sports] => Array ( [0] => tennis [1] => soccer ) )&nbsp;Array ( [things] => Array ( [0] => car [1] => plane ) )&nbsp;Array ( [things] => Array ( [0] => jeans [1] => shirt ) )&nbsp;ps:当然还有另一个函数可以总结相同的键,但不知何故我现在什么都没找到......我希望它有帮助:)
打开App,查看更多内容
随时随地看视频慕课网APP