php - PHP - 从巨大的多维索引数组中删除重复值的高效方法
问题描述
我在 PHP 中有一个巨大的多维索引数组,它可能有数以万计的子数组,如下所示:
Array
(
[0] => Array
(
[0] => James
[1] => Daniel
[2] => f12345
)
[2] => Array
(
[0] => Maria
[1] => Jameson
[2] => f00000
)
[3] => Array
(
[0] => John
[1] => Smith
[2] => f12345
)
)
每个子数组的最后一个值是作为字符串的 ID,我想清理我的数组,使其仅包含给定 ID 的第一个出现的子数组,删除具有相同 ID 的其他数组(删除整个子数组而不仅仅是值)。可以有许多具有相同 ID 的重复数组,也可以有许多不同的 ID。ID 值始终具有相同的键(在本例中为最后一个,即 2)。
预期结果:
Array
(
[0] => Array
(
[0] => James
[1] => Daniel
[2] => f12345
)
[2] => Array
(
[0] => Maria
[1] => Jameson
[2] => f00000
)
)
最快、最高效的方法是什么?
源是通过网络表单上传的 CSV 文件,我将其转换为这样的数组:array_map('str_getcsv', file($tmpName));
解决方案
最好在读取文件时处理文件中的每条记录,看看是否已经遇到过相同的代码。使用
array_map('str_getcsv', file($tmpName));
本身将读取所有文件,然后处理每一行,str_getcsv
然后您可能仍需要再次处理每一行以检查重复项。
此代码使用一次读取一行,fgetcsv()
然后检查是否已经遇到过( using !isset($used[$row[2]])
, usingisset()
比仅将代码列表添加到数组并每次搜索要快。)如果尚未使用,则将该行添加到输出并将代码标记为正在使用...
$used = [];
$output = [];
$input = fopen("a.csv", "r");
while($row = fgetcsv($input)) {
if ( !isset($used[$row[2]]) ){
$output[] = $row;
$used[$row[2]] = 1;
}
}
推荐阅读
- c# - 无法将类型“UnityEngine.AudioClip”隐式转换为“UnityEngine.AudioSource”
- react-native - node_modules 找不到 com.android.tools.build:gradle:4.1.1
- python - 编写程序以在右括号“)”没有开头的左括号“(”时打印“无效输入”
- amazon-web-services - 无服务器 (AWS) 计划作业每周一运行
- html - 如果父元素有自己的变换,为什么 CSS translateZ 会被忽略?
- php - UTF-8 字符的 php $_POST 正在转换为 CP1251
- c# - 为什么我的玩家模型在我向前移动时会立即传送到地面之上?
- python - 使用 auto-py-to-exe (py-installer) 将 .py 文件编译成 .exe 时如何解决此错误
- java - 在 Redhat 7.6 中更新 OpenJDK - 问题
- robotframework - 如何将变量列表中的多个值解析为测试用例