PHP Rimuove gli elementi dall'array associativo


100

Ho un array PHP che assomiglia a questo:

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

Quando var_dump i valori dell'array ottengo questo:

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

Volevo rimuovere Completato e Contrassegna come spam . So di poterlo fare unset[$array[3],$array[4]), ma il problema è che a volte il numero di indice può essere diverso.

Esiste un modo per rimuoverli facendo corrispondere il nome del valore anziché il valore della chiave?


non sei sicuro di aver capito la domanda qui a portata di mano? Cosa intendi a volte il numero di indice può essere diverso?
Simon H

Risposte:


153

Il tuo array è piuttosto strano: perché non usare semplicemente l' keyindice as e valueil valore as ...

Non sarebbe molto più semplice se il tuo array fosse dichiarato in questo modo:

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

Ciò ti consentirebbe di utilizzare i valori di keyas index per accedere all'array ...

E saresti in grado di utilizzare le funzioni per cercare i valori, come ad esempio array_search():

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

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

var_dump($array);

Più facile che con il tuo array, no?



Invece, con il tuo array che assomiglia a questo:

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

Dovrai eseguire il ciclo su tutti gli elementi, analizzarli valuee disimpostare gli elementi giusti:

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

Anche se fattibile, non è così semplice ... e insisto: non puoi cambiare il formato del tuo array, per lavorare con un sistema chiave / valore più semplice?


"Dovrai eseguire il loop su tutti gli elementi, per analizzare il valore". Quando utilizzi array_search potresti anche cercare in tutti gli elementi.
Nicolas Aoki

96
  ...

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



  return array_values($array);
  ...

3
Grazie, stavo cercando solo questo.! :)
Ravi Dhoriya ツ

2
bello e facile . Sto solo cercando questo
Faisal Mehmood Awan

Questa è la risposta vera, non quella controllata.
A.Seddighi

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Per array 2D ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}


3

Perché non utilizzare 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);

Tieni presente che il tuo array verrà reindicizzato.


1

Prova questo:

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

/ edit Come menzionato da JohnP, questo metodo funziona solo per array non annidati.


0

Il modo per farlo è prendere il tuo array di destinazione nidificato e copiarlo in un unico passaggio su un array non annidato. Eliminare le chiavi e quindi assegnare la matrice tagliata finale al nodo nidificato della matrice precedente. Ecco un codice per renderlo semplice:

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

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

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

0

Non sono d'accordo con la risposta accettata. A volte l'architettura di un'applicazione non vuole che tu faccia confusione con l'ID dell'array, o lo rende scomodo. Ad esempio, uso spesso CakePHP e una query di database restituisce la chiave primaria come valore in ogni record, molto simile a quanto sopra.

Supponendo che l'array non sia stupidamente grande, userei array_filter. Questo creerà una copia dell'array, meno i record che vuoi rimuovere, che puoi riassegnare alla variabile dell'array originale.

Sebbene questo possa sembrare inefficiente, in realtà è molto in voga in questi giorni che le variabili siano immutabili, e il fatto che la maggior parte delle funzioni di array php restituiscano un nuovo array piuttosto che vanificare con l'originale implica che PHP vuole che tu lo faccia anche tu. E più lavori con gli array e ti rendi conto di quanto sia difficile e fastidiosa la funzione unset (), questo approccio ha molto senso.

Comunque:

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

Puoi utilizzare qualsiasi logica di inclusione (ad es. Il tuo campo id) nella funzione incorporata che desideri.


-1

per l'uso di un singolo array reset($item)


La funzione di ripristino dovrebbe essere utilizzata per spostare il puntatore di array interno, non per rimuovere elementi o annullare gli elementi da un array. Usa invece unset. Se la tua soluzione funziona, ha anche effetti collaterali indesiderati.
David
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.