5

I have this array:

array(0, 3, 4, 3, 6);

And I want to filter out doubles, but keep the last result

array_unique gives me 0, 3, 4, 6.. but I need it to give 0, 4, 3, 6 (so it keeps the last 3, instead of the first)

4

2 回答 2

9

只需反转它:

// Reverse an array, starting backwards
function array_unique_end($array)
{
  return array_reverse(array_unique(array_reverse($array)));
}

然而,这不会非常高效。您最好创建自己的实现

于 2013-05-27T16:47:00.633 回答
3

这将是一种方式,向后遍历数组:

$arr = array(0, 3, 4, 3, 6);

$res = array();
for ($i = count($arr) - 1; $i >= 0; --$i) {
        $item = $arr[$i];

        if (!isset($res[$item])) {
                $res = array($item => $item) + $res; // unshift
        }
}
print_r(array_values($res));

我通过使用中间映射在速度和内存之间进行了权衡,以便isset()可以使用它,从中剥离值(或键)以形成最终结果。

更新

随着数组变大,它的性能优于 doublearray_reverse()array_unique()方法,所以它毕竟不是那么糟糕 :)

于 2013-05-27T16:58:59.893 回答