php 排好序的数组去重 array_unique

* 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

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

猜你喜欢

转载自blog.csdn.net/fareast_mzh/article/details/83382501
今日推荐