php - 从一维数组创建关联数组
问题描述
不太确定这里应该是什么问题的标题...
样本 .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 行的重复项。
更详细的描述我的要求:
- 每行有 3 个字段。
- 第三个字段成为
key
新关联数组中的 a 。 - 剩下的两个字段(第一个和第二个)成为
values
那个key
。 - 因为多行可能(并且确实)包含相同的第三个字段(而第一和第二个字段的组合总是不同的),所以我需要将所有这些重复键的值合并为 1。
PS我可以在之后解析该数组(以删除重复值),但真正的 .csv 文件很大,处理它变得太慢,并且我在标记的行收到以下错误// MEMORY ERROR
:
致命错误:允许的内存大小为 134217728 字节已用尽
我尝试增加内存限制,但如果可能的话,我宁愿避免这种情况。
解决方案
应该会轻松一些。不需要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);
}
推荐阅读
- spring - 流中带有“Collectors.toList()”的SpEL解析参数不能作为表达式字符串工作?
- php - 帖子编辑器中未显示 Wordpress 元字段
- javascript - 如何将类方法设置为事件处理程序?
- android - 保存单选按钮android的状态
- angular - 如何在规范文件中创建构造函数的二维数组(带有 2 个参数)
- prolog - Prolog:为谓词中的变量赋值
- javascript - 我找不到我的不和谐机器人中的错误
- javascript - 为什么在php中使用cropper js上传图像时需要不工作
- vue.js - 同源策略不允许读取远程资源(原因:缺少 CORS 标头“Access-Control-Allow-Origin”)
- authentication - 无法对 Azure AD 中的自定义 API 进行身份验证(JWT 令牌问题)