Mam tablicę PHP, która wygląda mniej więcej tak:
Index Key Value
[0] 1 Awaiting for Confirmation
[1] 2 Assigned
[2] 3 In Progress
[3] 4 Completed
[4] 5 Mark As Spam
Kiedy var_dump wartości tablicy otrzymuję to:
array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }
Chciałem usunąć Ukończone i Oznacz jako Spam . Wiem, że mogę unset[$array[3],$array[4])
, ale problem polega na tym, że czasami numer indeksu może być inny.
Czy istnieje sposób na ich usunięcie przez dopasowanie nazwy wartości zamiast wartości klucza?
Odpowiedzi:
Twoja tablica jest dość dziwna: dlaczego nie użyć po prostu
key
indeksu as, avalue
as ... wartości?Czy nie byłoby o wiele łatwiej, gdyby tablica została zadeklarowana w ten sposób:
Umożliwiłoby to użycie wartości
key
jako indeksów w celu uzyskania dostępu do tablicy ...Będziesz mógł używać funkcji do wyszukiwania wartości, takich jak
array_search()
:Łatwiej niż w przypadku macierzy, prawda?
Zamiast tego z tablicą, która wygląda następująco:
Będziesz musiał zapętlić wszystkie elementy, aby przeanalizować
value
i usunąć odpowiednie elementy:Nawet jeśli jest to możliwe, nie jest to takie proste ... i nalegam: czy nie możesz zmienić formatu swojej tablicy, aby pracować z prostszym systemem klucz / wartość?
źródło
źródło
Tablice 2D ...
źródło
Możesz tego użyć
źródło
Dlaczego nie używać array_diff?
Zwróć uwagę, że twoja tablica zostanie ponownie zindeksowana.
źródło
Spróbuj tego:
/ edit Jak wspomniał JohnP, ta metoda działa tylko dla tablic niezagnieżdżonych.
źródło
Sposób na zrobienie tego, aby wziąć zagnieżdżoną tablicę docelową i skopiować ją w jednym kroku do tablicy niezagnieżdżonej. Usuń klucz (i), a następnie przypisz ostateczną przyciętą tablicę do zagnieżdżonego węzła wcześniejszej tablicy. Oto kod, który to upraszcza:
źródło
Nie zgadzam się z zaakceptowaną odpowiedzią. Czasami architektura aplikacji nie chce, abyś majstrował przy identyfikatorze tablicy lub sprawia, że jest to niewygodne. Na przykład dość często używam CakePHP, a zapytanie do bazy danych zwraca klucz podstawowy jako wartość w każdym rekordzie, bardzo podobnie do powyższego.
Zakładając, że tablica nie jest głupio duża, użyłbym array_filter. Spowoduje to utworzenie kopii tablicy bez rekordów, które chcesz usunąć, które możesz przypisać z powrotem do oryginalnej zmiennej tablicowej.
Chociaż może się to wydawać nieefektywne, w dzisiejszych czasach jest bardzo modne, aby zmienne były niezmienne, a fakt, że większość funkcji tablicowych php zwraca nową tablicę, a nie z oryginałem, sugeruje, że PHP trochę chce, abyś to zrobił. Im więcej pracujesz z tablicami i zdajesz sobie sprawę, jak trudna i irytująca jest funkcja unset (), takie podejście ma sens.
Tak czy siak:
Możesz użyć dowolnej logiki włączania (np. Pola identyfikatora) w funkcji osadzonej, którą chcesz.
źródło
dla pojedynczej tablicy Użycie elementu
reset($item)
źródło