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

Nigel Ren

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

array_map('str_getcsv', file($tmpName));

本身将读取所有文件,然后使用来处理每一行,str_getcsv然后您可能仍然必须再次处理每一行以检查重复项。

此代码每次使用读取一行,fgetcsv()然后检查是否已遇到(使用!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;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章