首页 > 解决方案 > 从一维数组创建关联数组

问题描述

不太确定这里应该是什么问题的标题...

样本 .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. 剩下的两个字段(第一个和第二个)成为values那个key
  4. 因为多行可能(并且确实)包含相同的第三个字段(而第一和第二个字段的组合总是不同的),所以我需要将所有这些重复键的值合并为 1。

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

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

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

标签: phparrays

解决方案


应该会轻松一些。不需要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);
}

推荐阅读