Dzieje się tak dlatego array_unique
prace first sorting the values as strings, następnie iterating ponad posortowanej tablicy i dla każdej wartości wyłączającej z wyniku wszystkich kolejnych wartości, które porównują równa nim.
Funkcja porównywania dla "porównania równości" powyżej jest wybierana zgodnie z drugim parametrem, który dla SORT_REGULAR
jest taki sam jak sprawdzanie równości z ==
.
To zachowanie powoduje wiele kupek. Ponieważ sortowanie to quicksort, jest niestabilne. Dlatego sortowanie tablicy zawierającej zarówno 1
jak i '1'
nie daje żadnej gwarancji, która z nich będzie pierwsza w wyniku. Oznacza to, że array_unique
może wydawać się dowolnie "preferować" 1
w niektórych przypadkach i '1'
w innych.
Jednak szaleństwo kontynuuje: uważają, że jeżeli rodzaj produkuje [1, '1', '1a']
następnie '1a'
będzie nie zostać ujęte w wyniku (porównuje równa 1
), podczas gdy rodzaj produkuje ['1', 1, '1a']
to będzie być włączone (to robi nie można porównać z ciągiem znaków '1'
)!
Czy ta iteracja występuje tylko raz? Ponieważ wtedy powinniśmy uzyskać zduplikowane wartości, jeśli inny '1' jest zawarty po' 5' –
@OneTrickPony: Nie powiedziałem wyraźnie, że tablica jest sortowana jako pierwsza (dokumentacja robi). Ale z drugiej strony jest to bardzo ważne, ponieważ sortowanie nie jest stabilne (quicksort), więc pozwól mi nieco rozszerzyć odpowiedź. – Jon
@OneTrickPony: Właściwie to działa nieco inaczej niż sądziłem - i prawdopodobnie nie będziesz zaskoczony tym, że zachowanie nie może być przewidziane w takich przypadkach, ponieważ, cóż, PHP. – Jon