Mam tablicę PHP w następujący sposób:
$messages = [312, 401, 1599, 3, ...];
Chcę usunąć element zawierający wartość $del_val
(na przykład $del_val=401
), ale nie znam jego klucza. Może to pomóc: każda wartość może być tam tylko raz .
Proszę o najprostszą funkcję do wykonania tego zadania.
Odpowiedzi:
Używając
array_search()
iunset
, spróbuj wykonać następujące czynności:array_search()
zwraca klucz znalezionego elementu, którego można użyć do usunięcia tego elementu z oryginalnej tablicy za pomocąunset()
. WróciFALSE
po awarii, jednak w przypadku sukcesu może zwrócić wartość fałsz-y (0
na przykład kluczem ), dlatego!==
używany jest operator ścisłego porównania .if()
Oświadczenie sprawdzi, czyarray_search()
zwrócony wartość i będzie wykonywać jedynie działania, jeśli tak się stało.źródło
array_diff()
byłoby wolniej, ponieważ porównuje dwie tablice, a nie tylko przeszukuje jedną podobnąarray_search()
.$key
jest0
?0
szukana wartość ma klucz lub inną wartość falsey, nie rozbroi tej wartości, a kod nie będzie działał. Powinieneś przetestować$key === false
. (edytuj - masz to)Cóż, usunięcie elementu z tablicy jest w zasadzie tylko różnicą dla jednego elementu.
Ładnie się uogólnia, jeśli chcesz, możesz jednocześnie usunąć tyle elementów, ile chcesz.
Uwaga: Zauważ, że moje rozwiązanie tworzy nową kopię tablicy, zachowując starą nietkniętą w przeciwieństwie do przyjętej odpowiedzi, która mutuje. Wybierz ten, którego potrzebujesz.
źródło
[$element]
, użyłemarray($element)
zamiast tego. Żaden biggie, ale chciał tylko, aby każdy, kto miał podobny problem, wiedział, że nie był samarray_diff
używa(string) $elem1 === (string) $elem2
jako warunku równości, a nie$elem1 === $elem2
jak można się spodziewać. Problem wskazany przez @ nischayn22 jest tego konsekwencją. Jeśli chcesz użyć czegoś jako funkcji narzędzia, która będzie działać dla tablic dowolnych elementów (które mogą być obiektami), odpowiedź Bojangle może być lepsza z tego powodu.array_diff()
a zatem przesuwa środowisko wykonawcze do O (n lg n) z O (n).Ciekawym sposobem jest użycie
array_keys()
:array_keys()
Funkcja przyjmuje dwa dodatkowe parametry, aby wrócić tylko klucze do określonej wartości i czy wymagana jest ścisła kontrola (czyli używając === dla porównania).Może to również usunąć wiele elementów tablicy o tej samej wartości (np
[1, 2, 3, 3, 4]
.).źródło
array_values()
; pozostałe klucze są nadal w tej samej kolejności, więc technicznie nie jest to „nieposortowane”Jeśli wiesz na pewno, że tablica będzie zawierała tylko jeden element o tej wartości, możesz to zrobić
Jeśli jednak twoja wartość może wystąpić więcej niż jeden raz w tablicy, możesz to zrobić
Uwaga: druga opcja działa tylko dla PHP 5.3 + z zamknięciami
źródło
źródło
Spójrz na następujący kod:
Możesz to zrobić:
I to da ci tę tablicę:
źródło
Najlepszym sposobem jest
array_splice
Powód najlepszego znajduje się tutaj: http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
źródło
[1, 2, 4 => 3]
.3
, tablica będzie[1, 2, 3]
; innymi słowy, wartość nie została usunięta. Żeby było jasne, nie mówię, że zawodzi we wszystkich scenariuszach, tylko w tym jednym.Lub po prostu ręczny sposób:
Jest to najbezpieczniejszy z nich, ponieważ masz pełną kontrolę nad tablicą
źródło
array_splice()
zamiastunset()
spowoduje zmianę kolejności indeksów tablic, co może być lepsze w tym przypadku.Poniższy kod spowoduje, że powtarzające się wartości zostaną usunięte z wiadomości $.
$messages = array_diff($messages, array(401));
źródło
Jeśli masz PHP
5.3+
, jest jeden kod wiersza:źródło
$value
, więc naprawdę musi zostać umieszczone w mini klasie, abyś mógł uzyskać dostęp$value
w zamknięciu ....Wynik
Array ( [0] => 312 [1] => 1599 [2] => 3 )
źródło
możesz to zrobić:
Objaśnienie : Usuń element, który ma klucz
401
po odwróceniu tablicy.źródło
401
?Aby usunąć wiele wartości, spróbuj tego:
źródło
Zapożyczył logikę podkreślenia.JS _.reject i utworzył dwie funkcje (ludzie wolą funkcje !!)
array_reject_value: Ta funkcja po prostu odrzuca podaną wartość (działa również dla PHP4,5,7)
array_reject: Ta funkcja po prostu odrzuca metodę wywoływania (działa dla PHP> = 5.3)
W naszym obecnym przykładzie możemy użyć powyższych funkcji w następujący sposób:
lub nawet lepiej: (ponieważ daje nam to lepszą składnię do użycia jak na przykład array_filter )
Powyższe może być użyte do bardziej skomplikowanych rzeczy, takich jak powiedzmy, że chcielibyśmy usunąć wszystkie wartości, które są większe lub równe 401, moglibyśmy to po prostu zrobić:
źródło
Spróbuj tego, jest to najlepszy i najszybszy sposób na usunięcie elementu według wartości
źródło
Odpowiedź @Bojangles pomogła mi. Dziękuję Ci.
W moim przypadku tablica może być asocjacyjna lub nie, więc dodałem następującą funkcję
pozdrowienia
źródło
pojedynczy kod liniowy (dzięki array_diff () ), użyj następującego:
źródło
Zaakceptowana odpowiedź konwertuje tablicę na tablicę asocjacyjną, więc jeśli chcesz zachować ją jako tablicę niepowiązaną z zaakceptowaną odpowiedzią, być może będziesz musiał użyć
array_values
również.Referencje są tutaj
źródło
Zgodnie z twoim wymaganiem „ każda wartość może istnieć tylko raz ”, jeśli chcesz zachować unikalne wartości w tablicy,
array_unique()
może być tym, czego szukasz.Wejście:
Wynik:
źródło
Jeśli wartości, które chcesz usunąć, są lub mogą znajdować się w tablicy. Użyj funkcji array_diff . Wydaje się, że działa świetnie na takie rzeczy.
array_diff
źródło
Wiem, że to wcale nie jest wydajne, ale jest proste, intuicyjne i łatwe do odczytania.
Jeśli więc ktoś szuka nie tak wymyślnego rozwiązania, które można rozszerzyć do pracy z większymi wartościami lub bardziej szczegółowymi warunkami ... oto prosty kod:
źródło
Uzyskaj klucz tablicy za pomocą
array_search()
.źródło
Jeśli nie znasz jego klucza, oznacza to, że to nie ma znaczenia.
Możesz umieścić wartość jako klucz, co oznacza, że natychmiast znajdzie wartość. Lepsze niż wyszukiwanie we wszystkich elementach w kółko.
źródło
One-liner z
or
operatorem:źródło
możesz odwołać się do tego adresu URL : dla funkcji
Zatem wyjście powinno być
źródło
Kolejny pomysł, aby usunąć wartość tablicy, użyj array_diff. Jeśli chcę
(Doc: http://php.net/manual/fr/function.array-diff.php )
źródło
Myślę, że najprostszym sposobem byłoby użycie funkcji z pętlą foreach:
Dane wyjściowe będą:
źródło
W PHP 7.4 za pomocą funkcji strzałek:
Aby zachować tablicę niesocjacyjną, zawiń ją
array_values()
:źródło