Ciò accade perché array_unique
opere first sorting the values as strings, quindi iterating sulla matrice ordinata e per ogni valore escludendo dal risultato tutti i valori successivi che risultano uguali ad esso.
La funzione di comparazione per "confronto uguali" sopra viene scelto in base al secondo parametro, che per SORT_REGULAR
è la stessa di un controllo di parità con ==
.
Questo comportamento genera un sacco di trucchi. Dato che l'ordinamento è quicksort, è instabile. Pertanto, l'ordinamento di una matrice che contiene sia 1
e '1'
non garantisce che si finisce per essere il primo risultato. Ciò significa che array_unique
potrebbe sembrare arbitrariamente "preferire" 1
in alcuni casi e '1'
in altri.
Tuttavia la follia continua: considerare che se il genere produce [1, '1', '1a']
poi '1a'
sarà non essere inclusi nel risultato (confronta pari a 1
) mentre se il tipo produce ['1', 1, '1a']
allora sarà essere inclusi (lo fa non confrontare uguale alla stringa '1'
)!
Questa iterazione si verifica solo una volta? Perché allora dovremmo ottenere valori duplicati se è incluso un altro '1' dopo' 5' –
@OneTrickPony: non ho menzionato esplicitamente che l'array è ordinato per primo (la documentazione lo fa). Ma a pensarci bene è abbastanza importante perché l'ordinamento non è stabile (quicksort), quindi permettimi di espandere un po 'la risposta. – Jon
@OneTrickPony: In realtà funziona un po 'diverso da quello che credevo - e probabilmente non sarai sorpreso di sapere che il comportamento non può essere previsto in casi come questo perché, beh, PHP. – Jon