2013-05-27 3 views
2

У меня есть этот массив:Держите уникальные значения массива, сохраняя порядок, сохраняя последнее вхождение каждого

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

И я хочу, чтобы отфильтровать двойник, но сохранить результат последнего

array_unique дает меня 0, 3, 4, 6 .. но мне нужно, чтобы дать 0, 4, 3, 6 (так он сохраняет последние 3, вместо первого)

+1

1) осуществлять свою собственную функцию, или 2) обратный массив до и после. – deceze

+1

@deceze too bad нет 'array_reduce_right()' :) –

+1

@Jack https://github.com/lstrojny/functional-php: -3 – deceze

ответ

7

Просто повернуть его вспять:

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

Это, однако, не очень эффективно. Вы могли бы быть лучше создать свою собственную реализацию

+2

+1. но вам не хватает s в функции 'array_reverse'. :) –

+1

+1, но 'array_unique_right' может быть лучшим именем. :) – deceze

+1

Отредактировано - спасибо оба :-). – Ven

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(), из которого значения (или ключи) могут быть удалены, чтобы сформировать окончательный результат.

Update

Он превосходит двойной array_reverse() и array_unique() подход, поскольку массив становится больше, так что это не так уж плохо :)

+0

+ 1'ed. пожалуйста, поделитесь эталоном :) – arnaud576875

+1

@ arnaud576875 https://gist.github.com/datibbaw/260772aef07957393092 - сам эталонный код - работа в процессе ;-) –

Смежные вопросы