2012-04-10 10 views
7

Ho un allineamento generato dinamicamente di nomi di file, diciamo sembra qualcosa di simile:modo efficace per eliminare più elementi array PHP

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

Ho un paio di nomi di file specifici che voglio scartato dalla matrice :

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

Quindi, io so sempre i valori degli elementi che voglio scartato, ma non le chiavi.

Attualmente sto esaminando un paio di modi per farlo. Un modo, utilizzando array_filter e una funzione personalizzata:

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")); 

Un altro modo, 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); 

Entrambi i modi di produrre il risultato desiderato.

Mi chiedo quale sarebbe più efficiente (e perché)?

O forse c'è un altro modo più efficiente per farlo?

Come forse c'è un modo per avere più valori di ricerca nella funzione array_search?

+0

Ciao Feanne: non è necessario modificare il titolo dopo aver trovato una risposta accettabile. StackOverflow si prende cura di tutto ciò una volta che si preme il segno di spunta verde :) –

+0

Notato, grazie @MikeB :) – Feanne

risposta

17

Si dovrebbe utilizzare semplicemente 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 delle cose cattive su di PHP è che ha un'infinità di funzioni per fare cose specifiche piccole, ma che può anche rivelarsi conveniente a volte.

Quando vi imbattete in una situazione come questa (di aver trovato una soluzione dopo aver individuato una funzione rilevante, ma non siete sicuri se c'è qualcosa di meglio), è una buona idea per sfogliare la lista delle funzioni sulla barra laterale a php.net tempo libero. Basta leggere i nomi delle funzioni può pagare enormi dividendi.

+0

Grazie mille @ Jon - Mi ricorderò il tuo consiglio. Leggo l'elenco delle funzioni a piacere, ma non ho mai prestato molta attenzione alle funzioni "diff" perché non potevo immaginare come usarle ... ora lo so meglio! :) – Feanne

+0

cosa succede se quegli elementi non sono stringhe ma oggetto o matrici? e voglio rimuovere quegli elementi che hanno alcune proprietà eqlual su 'a' e 'b' per esempio? – Herokiller

+0

@Herokiller in questo caso devi andare con 'array_filter'. – Jon

1

Usa 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"); 

restituisce un array con tutti gli elementi di $ exclude_file_array che non si trovano in $ file.

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

È migliore della propria funzione e dei loop.

+0

Grazie, questo è stato segnalato e l'ho implementato nel mio codice. – Feanne

+0

Siete i benvenuti @Feanne come Jon ha detto sfogliare php.net per prima cosa sarebbe fantastico .. bel lavoro. –

Problemi correlati