PHP: Jak usunąć określony element z tablicy?

160

Jak usunąć element z tablicy, gdy znam nazwy elementów? na przykład:

Mam tablicę:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

użytkownik wchodzi strawberry

strawberry jest usunięty.

Aby w pełni wyjaśnić:

Mam bazę danych, która przechowuje listę elementów oddzielonych przecinkami. Kod wciąga listę na podstawie decyzji użytkownika, gdzie ten wybór się znajduje. Tak więc, jeśli wybiorą truskawkę, kod wciąga w każdym wpisie, w którym znajduje się truskawka, a następnie konwertuje to na tablicę za pomocą funkcji split (). Chcę, aby usunęli wybrane przez użytkownika elementy, na przykład truskawka, z tablicy.

dcp3450
źródło
4
To samo pytanie: stackoverflow.com/questions/7225070/ ...
trante
1
Kolejne to samo pytanie: stackoverflow.com/questions/1883421/…
Eric Lavoie
1
więcej tego samego pytania: stackoverflow.com/questions/369602/…
Alex

Odpowiedzi:

296

Użyj, array_searchaby uzyskać klucz i usuń go za pomocą unset:

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchzwraca false ( null do PHP 4.2.0), jeśli nie znaleziono żadnego elementu.

A jeśli może istnieć wiele elementów o tej samej wartości, możesz użyć, array_keysaby uzyskać klucze do wszystkich elementów:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}
Gumbo
źródło
Uzyskanie dziwnego wyniku. Skorzystałem z Twojej pierwszej sugestii, ponieważ zawsze będzie tylko jedna instancja. Aby to przetestować, po prostu kazałem mu wyprowadzić wartość klucza. Pracował. Jednak to się nie zmieni.
dcp3450
1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "submenus"); $ submenuArray = split (',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {unset ($ submenuArray [$ key]); }}
dcp3450
@ dcp3450: A z czym robisz $submenuArray? (Zauważ, że każda pętla $submenuArrayzostanie nadpisana.)
Gumbo
zaktualizowałem moje pytanie, aby lepiej wyjaśnić. Zasadniczo kod przechodzi przez wpisy w bazie danych, usuwając wybrane elementy, w tym przykładzie „truskawka”. Tak więc użytkownik wprowadza zaznaczenie => kod przeszukuje podmenu i znajduje listę, która ma tę opcję => zamienia tę listę w tablicę => usuwa wybraną opcję.
dcp3450
1
Mam to! Nie przepisałem nowej tablicy z powrotem do DB. Łatwo przeoczyć rzeczy, gdy tak długo wpatrujesz się w kod.
dcp3450
153

Użyj array_diff()dla rozwiązania 1-liniowego:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Nie ma potrzeby stosowania dodatkowych funkcji ani pętli dla wszystkich.

bolączki
źródło
8
To rozwiązanie jest dużo bardziej czytelne niż te najlepsze.
Robbert
Chociaż jeśli strawberrynie ma go w początkowej tablicy, stanie się dostępny w $array_without_strawberriestablicy - niebezpieczny kod, jeśli chcesz mieć pewność, że dany element nie znajduje się w tablicy.
Erfan
5
@Erfan Twoje roszczenie jest błędne. $a = array_diff(array(), array('strawberry'));- $ a to pusta tablica.
bancer
1
Masz rację @bancer - prawdopodobnie myślałem o array_intersect lub czymś w tym rodzaju.
Erfan
1
array_diff () jest bardziej elegancka niż zaznaczona odpowiedź.
Dom DaFonte
36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
John Conde
źródło
2
Powinieneś sprawdzić, czy truskawka w ogóle jest w tablicy.
Gumbo
Zgodnie z radą Gumbo zmodyfikowano odpowiedź, aby uwzględnić weryfikację elementu przed usunięciem go z tablicy.
John Conde
2
Pamiętaj również, że indeksy nie są ponownie wyrównane po usunięciu określonego elementu. Innymi słowy, sekwencja indeksu będzie miała wtedy luki. Jeśli usuniesz słowo „truskawka” z przykładu, „kiwi” nadal będzie mieć indeks 4, a indeks 2 po prostu zniknie. Ma znaczenie, jeśli twój kod opiera się na kompletności sekwencji indeksu, jak na przykład dla pętli ($ i = 0; $ i <.., $ i ++).
król bananów
2
Aby dodać do tego, co powiedział król-bananów, jeśli chcesz ponownie zindeksować tablicę, po prostu zrób $my_array = array_values($my_array);.
ryeguy
2
Chociaż to rozwiązanie jest poprawne, przeszukuje tablicę DWUKROTNIE ( in_arrayi array_search). Użycie zwrotu array_searchjak w odpowiedzi Gumbo jest bardziej efektywne
Bogdan D
21

Jeśli używasz tutaj zwykłej tablicy (co wydaje się być przypadkiem), powinieneś zamiast tego użyć tego kodu:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) usuwa tylko element, ale nie zmienia kolejności w zwykłej tablicy.

Podobno mamy tablicę i używamy array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

W porównaniu do nieuzbrojonego:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Zwróć uwagę, jak unset($array[$key])nie zmienia kolejności tablicy.

ericluwj
źródło
Oficjalnie unsetnic nie zwraca. Więc json_encode(unset($array[2]))nie jest to jest właściwa dla porównania.
robsch
to jest dokładnie to, czego potrzebuję, dzięki ericluwj
ana
12

Możesz użyć filtru tablicy, aby usunąć elementy według określonego warunku $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});
srcspider
źródło
Głosuj przeciw. Ta niska jakość (ponieważ jest to odpowiedź zawierająca tylko kod i powoduje błąd analizy) jest duplikatem metody D.Martina, która wykorzystuje tylko anonimową funkcję wewnątrz array_filter(). Chociaż osobiście używałbym anonimowej funkcji w mojej implementacji, uważam, że właściwym działaniem na SO byłoby skomentowanie lub edycja odpowiedzi D.Martina, jeśli chcesz wprowadzić mikro-ulepszenie, aby ta strona nie była rozdęta. Usuń tę zduplikowaną odpowiedź.
mickmackusa
4

Będzie tak:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");
D.Martin
źródło
4

Jest to proste powtórzenie, które może usunąć wiele wartości z tablicy.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }
mmr
źródło
Jest to nieefektywny, samodzielny zamiennik tego, w czym programiści PHP już utworzyli array_diff(). Jak udało się to zdobyć trzy głosy za. Nikt nie powinien uważać tej odpowiedzi za pomocną ani wykorzystywać jej we własnych projektach. Zalecam usunięcie tej odpowiedzi - pomogłoby to uwolnić Twoje konto od odpowiedzi o niskiej jakości, zmniejszyć nadmiar odpowiedzi na tej stronie i zdobyć odznakę zdyscyplinowania. Odłożę mój głos przeciw, abyś miał czas na usunięcie w celu uzyskania nagrody.
mickmackusa
4

Po prostu możesz zrobić pojedynczą linię. To usunie element z tablicy


$array=array_diff($array,['strawberry']);

dılo sürücü
źródło
3

Obecnie używam tej funkcji:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

Możesz wprowadzić tablicę lub tylko ciąg znaków z elementami, które powinny zostać usunięte. Napisz to tak:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

LUB

$detils = array_delete('orange', $detils);

Zindeksuje go również.

jankal
źródło
2
To jest strasznie zagmatwane i błędne. Jak to zyskało 3 głosy za?!?
mickmackusa
2

Na to pytanie jest kilka odpowiedzi ale chcę dodać coś więcej bo gdy użyłem unsetlub array_diffmiałem kilka problemów z zabawą z indeksami nowej tablicy gdy dany element został usunięty (bo indeks początkowy jest zapisywany)

Wracam do przykładu:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

lub

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Jeśli wydrukujesz wynik, otrzymasz:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Wynik:

> apple
> orange
> blueberry
> kiwi

Ale indeksy zostaną zapisane i będziesz mieć dostęp do swojego elementu, takiego jak:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

Dlatego ostateczna tablica nie jest ponownie indeksowana. Musisz więc dodać po unsetlub array_diff:

$array_without_strawberries = array_values($array);

Po tym twoja tablica będzie miała normalny indeks:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

Powiązane z tym postem: Ponowne indeksowanie tablicy

wprowadź opis obrazu tutaj

Mam nadzieję, że to pomoże

Jordan Montel
źródło
1

Lepszym podejściem może być zachowanie wartości jako kluczy w tablicy asocjacyjnej, a następnie wywołanie array_keys()jej, gdy chcesz rzeczywistą tablicę. W ten sposób nie musisz używać, array_searchaby znaleźć swój element.

jishi
źródło
1
Twój post jest komentarzem, a nie odpowiedzią. Usuń i opublikuj pod samym pytaniem.
mickmackusa
1

Odpowiedź na usunięcie tablicy PHP według wartości (nie klucza) Podana przez https://stackoverflow.com/users/924109/rok-kralj

IMO jest najlepszą odpowiedzią, ponieważ usuwa i nie mutuje

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

Ładnie uogólnia, możesz usunąć tyle elementów, ile chcesz w tym samym czasie, jeśli chcesz.

Zastrzeżenie: Zauważ, że moje rozwiązanie tworzy nową kopię tablicy, zachowując starą nienaruszoną, w przeciwieństwie do akceptowanej odpowiedzi, która ulega mutacji. Z tego powodu może być nieco wolniejszy.

zaszczuty
źródło
1

Szukałem odpowiedzi na to samo pytanie i trafiłem na ten temat. Widzę dwa główne sposoby: połączenie array_search& unseti użycie array_diff. Na pierwszy rzut oka wydawało mi się, że pierwsza metoda byłaby szybsza, ponieważ nie wymaga tworzenia dodatkowej tablicy (jak przy użyciuarray_diff ). Ale napisałem mały test porównawczy i upewniłem się, że druga metoda jest nie tylko bardziej zwięzła, ale także szybsza! Cieszę się, że mogę się tym z tobą podzielić. :)

https://glot.io/snippets/f6ow6biaol

ПЭХАПЭШНИК
źródło
0

Wolałbym używać array_key_exists do wyszukiwania kluczy w tablicach, takich jak:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

aby skutecznie znaleźć określone, ponieważ array_search i in_array () nie działają tutaj. I usuń rzeczy za pomocą unset () .

Myślę, że to komuś pomoże.

ddsultan
źródło
0

Utwórz tablicę numeryczną z usunięciem określonej wartości tablicy

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Możesz polecić ten link ...

Sashtha Manik
źródło
Głosuj przeciw. Pytanie wyraźnie prosi o usunięcie wartości na podstawie wartości (nie klucza). Ta odpowiedź jest bezużyteczna, usuń ją.
mickmackusa
0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}
Krishna Jonnalagadda
źródło
Ta odpowiedź nie usuwa nawet wymaganej opcji.
Nigel Ren,
-1

Używając array_seach(), spróbuj wykonać następujące czynności:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()zwraca klucz znalezionego elementu, którego można użyć do usunięcia tego elementu z oryginalnej tablicy za pomocą unset(). Powróci FALSEna niepowodzenie, jednak można go zwrócić wartość „falsey” na sukces (klucz może być 0na przykład), dlatego ścisłe porównanie !==operator jest używany.

if()Oświadczenie sprawdzi, czy array_search()zwrócony wartość i będzie wykonywać jedynie działania, jeśli tak się stało.

Ravinder Singh
źródło
3
Głosuj przeciw. Jest to kopia metody Gumbo (obecnie akceptowane rozwiązanie), która została opublikowana lata wcześniej niż Twoja. Zduplikowane odpowiedzi nie mają wartości i powodują jedynie niepotrzebne powiększenie strony. Usuń swoją odpowiedź. Jeśli chcesz wyjaśnić odpowiedź Gumbo, zrób to, edytując jego odpowiedź lub poproś Gumbo o rozszerzenie własnej odpowiedzi ..
mickmackusa
-1
unset($array[array_search('strawberry', $array)]);
max li
źródło
2
Głosuj przeciw. Metoda array_search()- unset()została już opublikowana przez Johna Conde'a wiele lat przed twoją. Zduplikowane odpowiedzi nie mają wartości dla czytelników i są w rzeczywistości niedogodnością z powodu straty czasu podczas przewijania i czytania zbędnych informacji. Usuń tę odpowiedź.
mickmackusa
-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
Onome Mine Adamu
źródło
2
Możesz poprawić tę odpowiedź, pisząc zdanie lub dwa na temat a) tego, co robi kod oraz b) dlaczego uważasz, że jest to opcja spośród wszystkich innych odpowiedzi.
Robin Mackenzie
-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }
Rajendra Rajput
źródło
4
Oprócz udzielonej odpowiedzi, rozważ podanie krótkiego wyjaśnienia, dlaczego i jak to rozwiązuje problem.
jtate
-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);
user3296940
źródło
2
Proszę również dodać wyjaśnienie. Jak rozwiązuje problem.
Rahil Wazir,
twoja odpowiedź zamień jeden element tablicy na inny NIE, aby usunąć element
ahmed hamdy
Głosuj przeciw. Ta odpowiedź nie zapewnia oczekiwanych wyników. Usuń tę nieprawidłową odpowiedź.
mickmackusa