PHP: Come rimuovere un elemento specifico da un array?


160

Come rimuovo un elemento da un array quando conosco il nome degli elementi? per esempio:

Ho un array:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

entra l'utente strawberry

strawberry è rimosso.

Per spiegare a fondo:

Ho un database che memorizza un elenco di elementi separati da una virgola. Il codice viene inserito nell'elenco in base a una scelta dell'utente in cui si trova quella scelta. Quindi, se scelgono la fragola, trascinano il codice in ogni voce dove si trova la fragola, quindi la converte in un array usando split (). Voglio che rimuovano dall'array gli elementi scelti dall'utente, per questo esempio fragola.




Risposte:


296

Utilizzare array_searchper ottenere la chiave e rimuoverla con unsetse trovata:

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchrestituisce false ( null fino a PHP 4.2.0) se non è stato trovato alcun elemento.

E se possono esserci più elementi con lo stesso valore, puoi usare array_keysper ottenere le chiavi di tutti gli articoli:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}

Ottenere un risultato strano. Ho usato il tuo primo suggerimento poiché ci sarà sempre solo un'istanza. Per testarlo ho semplicemente avuto l'output del valore chiave. Lavorato. Tuttavia, non verrà disattivato.
dcp3450,

1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "sottomenu"); $ submenuArray = split (',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {unset ($ submenuArray [$ key]); }}
dcp3450,

@ dcp3450: e tu cosa fai $submenuArray? (Si noti che con ogni ciclo $submenuArrayverrà sovrascritto.)
Gumbo

ho aggiornato la mia domanda per spiegare meglio. Fondamentalmente il codice scorre attraverso le voci in un database rimuovendo gli elementi scelti, "fragola" in questo esempio. Quindi, l'utente inserisce una selezione => il codice cerca nei sottomenu e trova qualsiasi elenco che ha quell'opzione => trasforma quell'elenco in un array => rimuove l'opzione scelta.
dcp3450,

1
Capito! Non stavo riscrivendo il nuovo array nel DB. Cose facili da perdere quando fissi il codice per così tanto tempo.
dcp3450,

153

Utilizzare array_diff()per soluzione a 1 linea:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Non sono necessarie funzioni extra o foreach loop.


8
Questa soluzione è molto più leggibile di quelle migliori.
Robbert,

Sebbene se strawberrynon si trova nell'array iniziale, sarà disponibile $array_without_strawberriesnell'array - codice pericoloso se si desidera assicurarsi che un determinato elemento non si trovi in ​​un array.
Erfan,

5
@Erfan La tua richiesta è errata. $a = array_diff(array(), array('strawberry'));- $ a è un array vuoto.
bancer

1
Hai ragione @bancer - probabilmente stavo pensando a array_intersect o qualcosa del genere.
Erfan,

1
array_diff () è più elegante della risposta contrassegnata.
Dom DaFonte,

36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}

2
Dovresti verificare se la fragola è nell'array.
Gumbo,

Seguendo il consiglio di Gumbo, è stata modificata la risposta per includere la verifica dell'elemento prima di rimuoverlo dall'array.
John Conde,

2
Inoltre, tieni presente che gli indici non vengono riallineati dopo aver eliminato un elemento particolare. In altre parole, la sequenza dell'indice avrà degli spazi vuoti. Se elimini "fragola" dal tuo esempio, "kiwi" avrà ancora l'indice 4 e l'indice 2 semplicemente scomparirà. È importante se il codice si basa sulla completezza della sequenza dell'indice, come ad esempio per i cicli ($ i = 0; $ i <.., $ i ++).
the-banana-king,

2
Per aggiungere a ciò che ha detto the-banana-king, se vuoi reindicizzare l'array, fai semplicemente $my_array = array_values($my_array);.
Ryeguy,

2
Sebbene questa soluzione sia corretta, cerca nell'array DUE VOLTE ( in_arraye array_search). Usare il ritorno di array_searchcome nella risposta di Gumbo è più efficace
Bogdan D

21

Se stai usando un array semplice qui (che sembra il caso), dovresti invece usare questo codice:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) rimuove solo l'elemento ma non riordina l'array semplice.

Presumibilmente abbiamo un array e usiamo array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

Rispetto a non impostato:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Notare come unset($array[$key])non riordinare l'array.


Ufficialmente unsetnon restituisce nulla. Quindi json_encode(unset($array[2]))non è appropriato per un confronto.
Robsch,

questo è esattamente ciò di cui ho bisogno, grazie a ericluwj
ana

12

È possibile utilizzare il filtro array per rimuovere gli elementi in base a una condizione specifica su $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});

Downvote. Questa bassa qualità (perché è solo una risposta al codice e dà un errore di analisi) è un duplicato del metodo di D.Martin che utilizza semplicemente una funzione anonima all'interno array_filter(). Mentre personalmente utilizzerei una funzione anonima nella mia implementazione, credo che l'azione corretta su SO sarebbe quella di commentare o modificare la risposta di D.Martin se si desidera apportare un micro-miglioramento in modo che questa pagina non si gonfia. Elimina questa risposta duplicata.
Mickmackusa,

4

Sarà così:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");

4

Questa è una semplice reiterazione che può eliminare più valori nell'array.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }

Si tratta di un sostituto inefficiente fatto in casa per ciò che gli sviluppatori di PHP hanno già creato array_diff(). Come sono riusciti a ottenere tre voti positivi. Nessuno dovrebbe trovare utile questa risposta o usarla nei propri progetti. Ti consiglio di eliminare questa risposta: ciò servirebbe a liberare il tuo account da una risposta di bassa qualità, ridurre il rigonfiamento della risposta in questa pagina e ottenere un badge disciplinato. Rimanderò il mio downvote in modo da avere il tempo di cancellare per una ricompensa.
Mickmackusa,

4

Solo tu puoi fare una riga. Verrà rimosso l'elemento dall'array


$array=array_diff($array,['strawberry']);


3

Attualmente sto usando questa funzione:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

È possibile inserire un array o solo una stringa con gli elementi che devono essere rimossi. Scrivilo così:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

O

$detils = array_delete('orange', $detils);

Lo reindicizzerà anche.


2
Questo è orribilmente contorto e complicato. In che modo ha ottenuto 3 voti positivi?!?
Mickmackusa,

2

Questa domanda ha diverse risposte ma voglio aggiungere qualcosa di più perché quando ho usato unseto array_diffho avuto diversi problemi a giocare con gli indici del nuovo array quando l'elemento specifico è stato rimosso (perché l'indice iniziale viene salvato)

Torno all'esempio:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

o

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Se stampi il risultato otterrai:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Risultato:

> apple
> orange
> blueberry
> kiwi

Ma gli indici verranno salvati e quindi avrai accesso al tuo elemento come:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

Quindi l'array finale non viene reindicizzato. Quindi è necessario aggiungere dopo il unseto array_diff:

$array_without_strawberries = array_values($array);

Successivamente l'array avrà un indice normale:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

In relazione a questo post: Re-Index Array

inserisci qui la descrizione dell'immagine

Spero che possa essere d'aiuto


1

Un approccio migliore potrebbe essere quello di mantenere i valori come chiavi in ​​un array associativo e quindi invocarlo array_keys()quando si desidera un array reale. In questo modo non è necessario utilizzare array_searchper trovare il tuo elemento.


1
Il tuo post è un commento, non una risposta. Si prega di eliminare e pubblicare sotto la domanda stessa.
Mickmackusa,

1

La risposta all'array PHP elimina per valore (non chiave) fornita da https://stackoverflow.com/users/924109/rok-kralj

L'IMO è la risposta migliore in quanto rimuove e non muta

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

Si generalizza bene, puoi rimuovere tutti gli elementi che vuoi allo stesso tempo, se vuoi.

Dichiarazione di non responsabilità: si noti che la mia soluzione produce una nuova copia dell'array mantenendo intatta quella vecchia in contrasto con la risposta accettata che muta. Per questo potrebbe essere un po 'più lento.


1

Stavo cercando la risposta alla stessa domanda e mi sono imbattuto in questo argomento. Vedo due modi principali: la combinazione di array_search& unsete l'uso di array_diff. A prima vista, mi è sembrato che il primo metodo sarebbe stato più veloce, dal momento che non richiede la creazione di un array aggiuntivo (come quando si utilizza array_diff). Ma ho scritto un piccolo benchmark e mi sono assicurato che il secondo metodo non fosse solo più conciso, ma anche più veloce! Sono contento di condividere questo con te. :)

https://glot.io/snippets/f6ow6biaol


0

Preferirei usare array_key_exists per cercare chiavi in ​​array come:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

per trovare in modo efficace lo specificato, poiché array_search e in_array () non funzionano qui. E rimuovi le cose con unset () .

Penso che aiuterà qualcuno.


0

Crea una matrice numerica con elimina il particolare valore della matrice

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Puoi fare riferimento a questo link ..


Downvote. La domanda chiede chiaramente di rimuovere un valore basato sul valore (non sulla chiave). Questa risposta è inutile, per favore cancella.
Mickmackusa,

0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}

Questa risposta non rimuove nemmeno l'opzione richiesta.
Nigel Ren,

-1

Utilizzando array_seach(), prova quanto segue:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()restituisce la chiave dell'elemento che trova, che può essere usata per rimuovere quell'elemento dall'array originale usando unset(). Restituirà FALSEin caso di errore, tuttavia può restituire un valore "false" in caso di successo (la chiave potrebbe essere 0ad esempio), motivo per cui !==viene utilizzato l'operatore di confronto rigoroso .

L' if()istruzione verificherà se ha array_search()restituito un valore e eseguirà un'azione solo in caso affermativo .


3
Downvote. Questo è un duplicato del metodo di Gumbo (attualmente la soluzione accettata) che è stato pubblicato anni prima del tuo. Le risposte duplicate non hanno alcun valore e causano solo gonfia pagina non necessaria. Per favore cancella la tua risposta. Se desideri spiegare la risposta di Gumbo, fallo con una modifica sulla sua risposta o chiedi a Gumbo di espandere la propria risposta ..
mickmackusa

-1
unset($array[array_search('strawberry', $array)]);

2
Downvote. Il metodo array_search()- unset()era già stato pubblicato da John Conde anni prima del tuo. Le risposte duplicate non hanno alcun valore per i lettori e sono in realtà un inconveniente a causa del tempo perso durante lo scorrimento e la lettura di informazioni ridondanti. Elimina questa risposta.
Mickmackusa,

-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

2
Puoi migliorare questa risposta scrivendo una o due frasi su a) cosa fa il codice eb) perché pensi che sia un'opzione tra tutte le altre risposte.
Robin Mackenzie,

-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }

4
Oltre alla risposta fornita, ti consigliamo di fornire una breve spiegazione del perché e di come risolvere il problema.
jtate,

-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);

2
Si prega di aggiungere anche una spiegazione. Come risolve il problema.
Rahil Wazir,

la tua risposta sostituisce un elemento dell'array con un altro NO per rimuovere un elemento
ahmed hamdy,

Downvote. Questa risposta non fornisce l'output previsto. Elimina questa risposta errata.
Mickmackusa,
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.