2012-04-10 30 views
7

tengo una matriz generada dinámicamente los nombres de archivo, vamos a decir que se ve algo como esto:forma eficaz de eliminar varios elementos de matriz PHP

$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file"); 

Tengo un par de nombres de archivo específicos que quiero descartado de la matriz :

$exclude_file_1 = "meta-file-1"; 
$exclude_file_2 = "meta-file-2"; 

Por lo tanto, siempre sabré los valores de los elementos que quiero descartada, pero no las teclas.

Actualmente estoy mirando un par de maneras de hacer esto. Una forma , utilizando array_filter y una función personalizada:

function excludefiles($v) 
     { 
     if ($v === $GLOBALS['exclude_file_1'] || $v === $GLOBALS['exclude_file_2']) 
      { 
      return false; 
      } 
     return true; 
     } 

$files = array_values(array_filter($files,"excludefiles")); 

Otra forma, using array_keys and unset:

$exclude_files_keys = array(array_search($exclude_file_1,$files),array_search($exclude_file_2,$files)); 
foreach ($exclude_files_keys as $exclude_files_key) 
    {  
    unset($files[$exclude_files_key]); 
    } 
$files = array_values($page_file_paths); 

Ambas formas producen el resultado deseado.

estoy preguntando cuál sería el más eficiente (y por qué)?

¿O tal vez hay otra forma más eficiente de hacer esto?

Como tal vez hay una manera de tener múltiples valores de búsqueda en la función array_search?

+0

Hola Feanne - no hay necesidad de cambiar el título una vez que haya encontrado una respuesta aceptable. StackOverflow se encarga de todo lo que una vez que se pulsa el registro de entrada, marca verde :) –

+0

Destaca, gracias :) @MikeB – Feanne

Respuesta

17

Usted debe utilizar simplemente array_diff:

$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file"); 
$exclude_file_1 = "meta-file-1"; 
$exclude_file_2 = "meta-file-2"; 

$exclude = array($exclude_file_1, $exclude_file_2); 
$filtered = array_diff($files, $exclude); 

Una de las cosas malas acerca de PHP es que tiene infinidad de funciones que hacer pequeñas cosas específicas, pero que también puede llegar a ser conveniente a veces.

Cuando se encuentra con una situación como esta (ha encontrado una solución después de localizar una función relevante, pero no está seguro de si hay algo mejor), es una buena idea buscar la barra lateral de la lista de funciones en php.net en ocio. Solo leer los nombres de las funciones puede reportar grandes dividendos.

+0

Muchas gracias @ Jon - Voy a recordar su consejo. Leí la lista de funciones a gusto, pero nunca presté mucha atención a las funciones de "diferencias" porque no podía imaginar cómo las usaría ... ¡ahora lo sé mejor! :) – Feanne

+0

¿y si esos elementos no son cadenas sino objetos o matrices? y quiero eliminar esos elementos que tienen alguna propiedad eqlual a 'a' y 'b' por ejemplo? – Herokiller

+0

@Herokiller, en ese caso, debe ir con 'array_filter'. – Jon

1

Uso array_diff()

$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file"); 
$exclude_file_array = array("meta-file-1", "meta-file-2"); 

devolverá un array con todos los elementos de $ exclude_file_array que no se encuentran en los archivos $.

$new_array = array_diff($files, $exclude_file_array); 

Es mejor que su propia función y bucles.

+0

Gracias, esto ha sido señalado y lo he implementado en mi código. – Feanne

+0

Eres bienvenido @Feanne como Jon dijo que navega primero en php.net que sería genial ... buen trabajo. –

Cuestiones relacionadas