values repeated remove quitar multidimensional keys from duplicados delete array_unique array php big-o array-unique array-flip

repeated - quitar duplicados php array



array_unique vs array_flip (4)

Lo CodePad con usted: CodePad

Tu intuición sobre esto fue correcta!

$test=array(); for($run=0; $run<1000; $run++) $test[]=rand(0,100); $time=microtime(true); for($run=0; $run<100; $run++) $out=array_unique($test); $time=microtime(true)-$time; echo ''Array Unique: ''.$time."/n"; $time=microtime(true); for($run=0; $run<100; $run++) $out=array_keys(array_flip($test)); $time=microtime(true)-$time; echo ''Keys Flip: ''.$time."/n"; $time=microtime(true); for($run=0; $run<100; $run++) $out=array_flip(array_flip($test)); $time=microtime(true)-$time; echo ''Flip Flip: ''.$time."/n";

Salida:

Array Unique: 1.1829199790955 Keys Flip: 0.0084578990936279 Flip Flip: 0.0083951950073242

Tenga en cuenta que array_keys(array_flip($array)) proporcionará una nueva clave de valores en orden, que en muchos casos puede ser lo que desee (idéntico, excepto mucho más rápido que array_values(array_unique($array)) ), mientras que array_flip(array_flip($array)) es idéntico (excepto mucho más rápido) a array_unique($array) donde las claves siguen siendo las mismas.

Si tuviera una matriz de enteros con signo, por ejemplo:

Array ( [0] => -3 [1] => 1 [2] => 2 [3] => 3 [4] => 3 )

Para obtener valores únicos instintivamente utilizaría array_unique pero después de considerarlo, podría realizar array_flip dos veces, lo que tendría el mismo efecto, y creo que sería más rápido.

array_unique O (n log n) debido a la operación de clasificación que utiliza

array_flip O (n)

¿Estoy en lo cierto en mis suposiciones?

ACTUALIZACIÓN / EJEMPLO:

$intArray1 = array(-4,1,2,3); print_r($intArray1); $intArray1 = array_flip($intArray1); print_r($intArray1); $intArray1 = array_flip($intArray1); print_r($intArray1); Array ( [0] => -3 [1] => 1 [2] => 2 [3] => 3 [4] => 3 ) Array ( [-3] => 0 [1] => 1 [2] => 2 [3] => 4 ) Array ( [0] => -3 [1] => 1 [2] => 2 [4] => 3 )


Nada es mejor que correr tu propio punto de referencia.

➜ 8321620 cat first.php <?php $arr = array(-3, 1, 2, 3, 3); for($i = 0; $i <= 1000000; $i++) { array_unique($arr); } ➜ 8321620 time php first.php php first.php 3.24s user 0.01s system 99% cpu 3.251 total ➜ 8321620 cat second.php <?php $arr = array(-3, 1, 2, 3, 3); for($i = 0; $i <= 1000000; $i++) { array_flip(array_flip($arr)); } ➜ 8321620 time php second.php php second.php 1.50s user 0.01s system 99% cpu 1.514 total

Actualización: Array con 1000 elementos.

➜ 8321620 cat first.php <?php $arr = array(); for($i = 0; $i <= 1000; $i++) { $arr[] = rand(0, 1000); } for($i = 0; $i <= 10000; $i++) { array_unique($arr); } ➜ 8321620 time php first.php php first.php 27.50s user 0.03s system 99% cpu 27.534 total ➜ 8321620 cat second.php <?php $arr = array(); for($i = 0; $i <= 1000; $i++) { $arr[] = rand(0, 1000); } for($i = 0; $i <= 10000; $i++) { array_flip(array_flip($arr)); } ➜ 8321620 time php second.php php second.php 1.59s user 0.01s system 99% cpu 1.604 total

Así que sí, tu suposición fue correcta.


Precaución: esta técnica NO es un reemplazo directo para array_unique (). Solo funciona para matrices con valores que son claves válidas. (por ejemplo: cadena, entero, las cosas se pueden convertir a int). Y ciertamente no funciona para matrices de objetos.

$input = [true, false, 1, 0, 1.2, "1", "two", "0"]; var_export(array_unique($input)); array ( 0 => true, 1 => false, 3 => 0, 4 => 1.2, 6 => ''two'', )

vs:

var_export(array_keys(array_flip($input))); PHP Warning: array_flip(): Can only flip STRING and INTEGER values! in php shell code on line 1 array ( 0 => 1, 1 => 0, 2 => ''two'', )


tendrías que usar

array_keys( array_flip( $array ) );

lo que llevaría más tiempo

Yo iría por array_unique . Tiene el beneficio adicional de explicar qué está pasando.