repeated - quitar duplicados php array
array_unique vs array_flip (4)
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.