2010-11-29 23 views

Respuesta

12

array_diff es la respuesta obvia, pero ya que lo solicitado por la manera más eficiente, esto es una prueba

$big = range(1, 90000); 
$remove = range(500, 600); 

$ts = microtime(true); 
$result = array_diff($big, $remove); 
printf("%.2f\n", microtime(true) - $ts); 

$ts = microtime(true); 
$map = array_flip($remove); 
$result = array(); 
foreach($big as $e) 
    if(!isset($map[$e])) 
     $result[] = $e; 
printf("%.2f\n", microtime(true) - $ts); 

grabados en mi máquina

0.67 
0.03 

Así que el lazo simple con una búsqueda basada en hash es aproximadamente 20 veces más rápida que array_diff.

+0

¡Maldito eres bueno! :) +1 – Trufa

+0

Quiero objetar a esta respuesta debido al uso de la memoria o de alguna manera que array_diff realice la operación mejor ... pero no puedo pensar en nada preciso. Felicitaciones, ahora ve y dile a los desarrolladores de php que make array_diff sea más rápido. – Sparr

6

En el manual da para array_dif() este exaple:

<?php 
$array1 = array("a" => "green", "red", "blue", "red"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_diff($array1, $array2); 

print_r($result); 
?> 

Salidas:

Array 
(
    [1] => blue 
) 

Devuelve una matriz que contiene todos los entradas de matriz1 que están no presente en cualquiera de las otras matrices.

Cuestiones relacionadas