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.




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]);
}

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.


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)]);
}

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.


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';
});

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

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]);
    }

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']);


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ż.


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


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.


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.


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


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.


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 ...


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;
        }
}

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.


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

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.