首页 > 解决方案 > 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));

标签: phparrays

解决方案


最好在读取文件时处理文件中的每条记录,看看是否已经遇到过相同的代码。使用

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;
    }
}

推荐阅读