PHP Entfernen Sie Elemente aus dem assoziativen Array

100

Ich habe ein PHP-Array, das ungefähr so ​​aussieht:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

Wenn ich die Array-Werte var_dump bekomme, bekomme ich Folgendes:

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

Ich wollte Completed entfernen und als Spam markieren . Ich weiß, dass ich es kann unset[$array[3],$array[4]), aber das Problem ist, dass die Indexnummer manchmal unterschiedlich sein kann.

Gibt es eine Möglichkeit, sie zu entfernen, indem der Wertname anstelle des Schlüsselwerts abgeglichen wird?

user648198
quelle
Sie sind sich nicht sicher, ob ich die hier vorliegende Frage verstehe? Was meinst du manchmal kann die Indexnummer unterschiedlich sein?
Simon H

Antworten:

153

Ihr Array ist ziemlich seltsam: Warum nicht einfach den keyas-Index und den valueas ... -Wert verwenden?

Wäre es nicht viel einfacher, wenn Ihr Array so deklariert würde:

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

Auf diese Weise können Sie Ihre Werte keyals Indizes verwenden, um auf das Array zuzugreifen ...

Und Sie können Funktionen verwenden, um nach den Werten zu suchen, wie zum Beispiel array_search():

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

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

var_dump($array);

Einfacher als mit Ihrem Array, nein?



Stattdessen mit Ihrem Array, das so aussieht:

$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'), 
);

Sie müssen alle Elemente valuedurchlaufen, um die richtigen Elemente zu analysieren und zu deaktivieren:

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

Selbst wenn dies möglich ist, ist es nicht so einfach ... und ich bestehe darauf: Können Sie das Format Ihres Arrays nicht ändern, um mit einem einfacheren Schlüssel- / Wertesystem zu arbeiten?

Pascal MARTIN
quelle
"Sie müssen alle Elemente durchlaufen, um den Wert zu analysieren". Wenn Sie array_search verwenden, können Sie auch alle Elemente durchsuchen.
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
quelle
3
Danke, ich habe nur danach gesucht! :)
Ravi Dhoriya ツ
2
schön und einfach . Ich suche nur danach
Faisal Mehmood Awan
Dies ist die wahre Antwort, die nicht überprüft wurde.
A.Seddighi
16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Für 2D-Arrays ...

$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ć
quelle
7

Sie können dies verwenden

unset($dataArray['key']);
Anirban Das
quelle
3

Warum nicht array_diff verwenden?

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

Beachten Sie nur, dass Ihr Array neu indiziert wird.

Mikel Annjuk
quelle
1

Versuche dies:

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

/ edit Wie von JohnP erwähnt, funktioniert diese Methode nur für nicht verschachtelte Arrays.

Alp
quelle
0

So können Sie Ihr verschachteltes Zielarray in einem einzigen Schritt in ein nicht verschachteltes Array kopieren. Löschen Sie die Schlüssel und weisen Sie dann dem verschachtelten Knoten des früheren Arrays das endgültig zugeschnittene Array zu. Hier ist ein Code, um es einfach zu machen:

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

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

$list['resultset'][0] = $temp_array;
Nitish Pandey
quelle
0

Ich bin mit der akzeptierten Antwort nicht einverstanden. Manchmal möchte eine Anwendungsarchitektur nicht, dass Sie mit der Array-ID herumspielen, oder macht es unpraktisch. Zum Beispiel verwende ich CakePHP ziemlich oft, und eine Datenbankabfrage gibt den Primärschlüssel als Wert in jedem Datensatz zurück, sehr ähnlich wie oben.

Angenommen, das Array ist nicht dumm groß, würde ich array_filter verwenden. Dadurch wird eine Kopie des Arrays erstellt, abzüglich der Datensätze, die Sie entfernen möchten, und die Sie der ursprünglichen Arrayvariablen zurückweisen können.

Obwohl dies ineffizient erscheinen mag, ist es heutzutage sehr angesagt, dass Variablen unveränderlich sind, und die Tatsache, dass die meisten PHP-Array-Funktionen ein neues Array zurückgeben, anstatt mit dem Original zu fummeln, impliziert, dass PHP dies auch von Ihnen verlangt. Und je mehr Sie mit Arrays arbeiten und erkennen, wie schwierig und nervig die Funktion unset () ist, desto sinnvoller ist dieser Ansatz.

Wie auch immer:

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

Sie können eine beliebige Einschlusslogik (z. B. Ihr ID-Feld) in der gewünschten eingebetteten Funktion verwenden.

Roger Kaplan
quelle
-1

für Single Array Item verwenden reset($item)

Ivan Proskuryakov
quelle
Die Reset-Funktion sollte verwendet werden, um den internen Array-Zeiger zu verschieben, nicht um Elemente zu entfernen oder Elemente aus einem Array zu entfernen. Verwenden Sie stattdessen unset. Wenn Ihre Lösung überhaupt funktioniert, hat sie auch unerwünschte Nebenwirkungen.
David