PHP Usuń elementy z tablicy asocjacyjnej

100

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?

user648198
źródło
nie jestem pewien, czy rozumiem tu postawione pytanie? Co masz na myśli, że czasami numer indeksu może być inny?
Simon H,

Odpowiedzi:

153

Twoja tablica jest dość dziwna: dlaczego nie użyć po prostu keyindeksu as, a valueas ... wartości?

Czy nie byłoby o wiele łatwiej, gdyby tablica została zadeklarowana w ten sposób:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

Umożliwiłoby to użycie wartości keyjako indeksów w celu uzyskania dostępu do tablicy ...

Będziesz mógł używać funkcji do wyszukiwania wartości, takich jak array_search():

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

Łatwiej niż w przypadku macierzy, prawda?



Zamiast tego z tablicą, która wygląda następująco:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

Będziesz musiał zapętlić wszystkie elementy, aby przeanalizować valuei usunąć odpowiednie elementy:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

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ść?

Pascal MARTIN
źródło
„Będziesz musiał przeglądać wszystkie elementy, aby przeanalizować wartość”. Używając funkcji array_search, możesz również przeszukiwać wszystkie elementy.
Nicolas Aoki
96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...
ADFS
źródło
3
Dzięki, szukałem tylko tego.! :)
Ravi Dhoriya ツ
2
ładne i łatwe. właśnie tego szukam
Faisal Mehmood Awan
To jest prawdziwa odpowiedź, a nie to, co zostało sprawdzone.
A.Seddighi
16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Tablice 2D ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}
Dejan Marjanović
źródło
7

Możesz tego użyć

unset($dataArray['key']);
Anirban Das
źródło
3

Dlaczego nie używać array_diff?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

Zwróć uwagę, że twoja tablica zostanie ponownie zindeksowana.

Mikel Annjuk
źródło
1

Spróbuj tego:

$keys = array_keys($array, "Completed");

/ edit Jak wspomniał JohnP, ta metoda działa tylko dla tablic niezagnieżdżonych.

Turnia
źródło
0

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:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;
Nitish Pandey
źródło
0

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:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

Możesz użyć dowolnej logiki włączania (np. Pola identyfikatora) w funkcji osadzonej, którą chcesz.

Roger Kaplan
źródło
-1

dla pojedynczej tablicy Użycie elementu reset($item)

Ivan Proskuryakov
źródło
Funkcji resetowania należy używać do przesuwania wewnętrznego wskaźnika tablicy, a nie do usuwania elementów lub kasowania elementów z tablicy. Zamiast tego użyj nieustawionego. Jeśli twoje rozwiązanie w ogóle działa, ma również niepożądane skutki uboczne.
David,