2012-04-10 11 views
7

Mam generowanych dynamicznie tablicę z nazwami plików, powiedzmy, że wygląda to mniej więcej tak:skuteczny sposób usunąć wiele elementów z tablicy PHP

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

Mam kilka konkretnych nazw, które chcę wyrzucić z tablicy :

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

Tak, zawsze będę znać wartości elementów, które chcę odrzucić, ale nie klucze.

Obecnie patrzę na kilka sposobów, aby to zrobić. Jednym ze sposobów, przy użyciu array_filter i funkcję niestandardowy:

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

inny sposób 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); 

Oba sposoby uzyskania pożądanego rezultatu.

Zastanawiam się, który z nich byłby bardziej wydajny (i dlaczego)?

A może jest inny, bardziej skuteczny sposób na zrobienie tego?

Może istnieje sposób na uzyskanie wielu wartości wyszukiwania w funkcji array_search?

+0

Cześć Feanne - nie trzeba zmieniać tytułu, gdy już znajdziesz akceptowalną odpowiedź. StackOverflow zajmuje się tym wszystkim, gdy uderzysz w zielony znacznik wyboru :) –

+0

Zauważam, dziękuję @MikeB :) – Feanne

Odpowiedz

17

Należy po prostu użyć 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); 

jednym z tych złych rzeczy o PHP jest to, że ma zillions funkcji do zrobienia konkretne małe rzeczy, ale może również okazać się wygodniejsze czasami.

Gdy natkniesz się na taką sytuację (znalazłeś rozwiązanie po zlokalizowaniu odpowiedniej funkcji, ale nie masz pewności, czy jest coś lepszego), dobrym pomysłem jest przejrzenie paska bocznego listy funkcji na stronie php.net pod adresem wolny czas. Po prostu czytanie nazw funkcji może przynieść ogromne zyski.

+0

Dziękuję bardzo @ Jon - Zapamiętam twoją radę. Czytam listę funkcji w czasie wolnym, ale nigdy nie zwracałem uwagi na funkcje "diff", ponieważ nie mogłem sobie wyobrazić, jak bym ich użył ... teraz wiem lepiej! :) – Feanne

+0

co, jeśli te elementy nie są ciągami, ale obiektem lub tablicami? i chcę na przykład usunąć te elementy, które mają pewne zalety własnościowe na "a" i "b"? – Herokiller

+0

@Herokiller w takim przypadku musisz przejść do 'array_filter'. – Jon

1

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

zwróci tablicę ze wszystkimi elementami z $ exclude_file_array, że nie są w $ plików.

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

To lepsze niż twoja funkcja i pętle.

+0

Dziękuję, zostało to wskazane i zaimplementowałem je w moim kodzie. – Feanne

+0

Serdecznie witamy w serwisie @Feanne, ponieważ Jon powiedział, że najpierw przeglądamy php.net, to byłoby świetnie. Dobra robota. –

Powiązane problemy