php 排好序的数组去重 array

xiaoxiao2025-08-23  101

* shrink.php

<?php /** * $a = [1, 2, 3, 4, 5, 5, 5] * arrayshrink($a, 4, 7); // $a = [1,2,3,4,5] * remove elements from $start+1 to $end-1 */ function arrayshrink(array& $arr, int $start, int $end) { $n = count($arr); if ($start < -1 || $start >= $n) { throw new Exception("Illegal start"); } if ($end < $start || $end > $n) { throw new Exception("Illegal end"); } $delta = $end - $start - 1; $last = $n - $delta; for ($i = $start; $i < $last; $i++) { $arr[ $i ] = $arr[ $i + $delta ]; } for ($i = $last; $i < $n; $i++) { unset($arr[$i]); } } function sorted_array_unique(array &$a, callable $cmp) { for ($i = 0; $i < count($a); $i++) { for ($j = $i+1; $j < count($a); $j++) { if ($cmp($a[$j], $a[$i]) !== 0) { break; } } arrayshrink($a, $i, $j); } }

 

test:

$a = [1,1,1,2,3,4,4,4,4,4,5,5,5]; // arrayshrink($a, 5, 10); sorted_array_unique($a, function($a, $b) {     return $a - $b; }); print_r($a);

 

E:\code\php>php shrink.php Array (     [0] => 1     [1] => 2     [2] => 3     [3] => 4     [4] => 5 )

参照 array_unique 系统函数:

http://php.net/manual/en/function.array-unique.php

Note: Note that array_unique() is not intended to work on multi dimensional arrays.

可是对于多维数组、或者数组元素为对象的情况不能处理

所以自己写一个函数能指定 比较元素大小的回调函数就可以了  

这样可以用 usort 先排序

http://php.net/manual/en/function.usort.php

然后调用自己写的 sorted_array_unique 函数

完成去重

 

如果自己写个Set 集合来去重,需要的内存多。

每次都要 测试 in_array

http://php.net/manual/en/function.in-array.php

不知道数据量大时候是不是可行

 

 

转载请注明原文地址: https://www.6miu.com/read-5035199.html

最新回复(0)