it-swarm-eu.dev

PHP array elimina per valore (non chiave)

Ho un array PHP come segue:

$messages = [312, 401, 1599, 3, ...];

Voglio cancellare l'elemento che contiene il valore $del_val (ad esempio, $del_val=401), ma non conosco la sua chiave. Questo potrebbe aiutare: ogni valore può essere presente una sola volta .

Sto cercando la funzione più semplice per eseguire questa operazione per favore.

780
Adam Strudwick

Utilizzando array_search() e unset , 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à FALSE in caso di errore, tuttavia può restituire un valore falso-y in caso di successo (la tua chiave potrebbe essere 0 per esempio), motivo per cui viene utilizzato il severo operatore di confronto !==.

L'istruzione if() controllerà se array_search() ha restituito un valore e eseguirà un'azione solo se lo ha fatto.

1392
Bojangles

Bene, l'eliminazione di un elemento dall'array è fondamentalmente solo una differenza con un elemento.

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.

Disclaimer: Si noti che la mia soluzione produce una nuova copia dell'array mantenendo intatto quello vecchio in contrasto con la risposta accettata che muta. Scegli quello che ti serve.

564
Rok Kralj

Un modo interessante è usare array_keys() :

foreach (array_keys($messages, 401, true) as $key) {
    unset($messages[$key]);
}

La funzione array_keys() richiede due parametri aggiuntivi per restituire solo le chiavi per un determinato valore e se è richiesto un controllo rigoroso (ad esempio utilizzando === per il confronto).

Questo può anche rimuovere più elementi dell'array con lo stesso valore (ad esempio [1, 2, 3, 3, 4]).

102
Ja͢ck

Se sai per certo che il tuo array conterrà solo un elemento con quel valore, puoi farlo

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

Se, tuttavia, il tuo valore potrebbe verificarsi più di una volta nell'array, è possibile farlo

$array = array_filter($array, function($e) use ($del_val) {
    return ($e !== $del_val);
});

Nota: La seconda opzione funziona solo con PHP5.3 + con Closures

47
adlawson
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
36
Rmannn

Dai un'occhiata al seguente codice:

$arr = array('Nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');

Tu puoi fare:

$arr = array_diff($arr, array('remove_me', 'remove_me_also'));

E questo ti porterà questo array:

array('Nice_item', 'another_liked_item')
25
theCodeMachine

Il modo migliore è array_splice

array_splice($array, array_search(58, $array ), 1);

La ragione per la migliore è qui a http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in -PHP/

21

Con il seguente codice, i valori ripetitivi verranno rimossi dai messaggi $.

$messages = array_diff($messages, array(401));

19

O semplicemente, modo manuale:

foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

Questo è il più sicuro perché hai il pieno controllo sul tuo array

16
Victor Priceputu
function array_remove_by_value($array, $value)
{
    return array_values(array_diff($array, array($value)));
}

$array = array(312, 401, 1599, 3);

$newarray = array_remove_by_value($array, 401);

print_r($newarray);

Uscita

Array ( [0] => 312 [1] => 1599 [2] => 3 )

11
tttony

Se hai> php5.3, c'è il codice di una riga:

$array = array_filter($array, function($i) use ($value){return $i != $value;}); 
9
David Lin

Per eliminare più valori prova questo

while (($key = array_search($del_val, $messages)) !== false) 
{
    unset($messages[$key]);
}
8
Rajendra Khabiya

tu puoi fare:

unset($messages[array_flip($messages)['401']]);

Spiegazione: Eliminare l'elemento che ha la chiave 401 dopo aver capovolto la matrice.

8
Qurashi

Presa in prestito la logica di underscoreJS _.reject e creato due funzioni (le persone preferiscono le funzioni !!)

array_reject_value: Questa funzione sta semplicemente rifiutando il valore specificato (funziona anche con PHP4,5,7)

function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if ($value !== $deleteValue) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject: Questa funzione sta semplicemente rifiutando il metodo callable (funziona con PHP> = 5.3)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

Quindi nel nostro esempio attuale possiamo usare le funzioni di cui sopra come segue:

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

o anche meglio: (questo ci dà una sintassi migliore da usare come array_filter uno)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

Quanto sopra può essere usato per cose più complicate come diciamo che vorremmo rimuovere tutti i valori maggiori o uguali a 401 potremmo semplicemente fare questo:

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});
5

codice single-liner (grazie a array_diff () ), usare come segue:

$messages = array_diff($messages, array(401));
5
Star

@Bojangles risposta mi ha aiutato. Grazie.

Nel mio caso, l'array potrebbe essere associativo o meno, quindi ho aggiunto questa funzione

function test($value, $tab) {

 if(($key = array_search($value, $tab)) !== false) {
    unset($tab[$key]); return true;

 } else if (array_key_exists($value, $tab)){
        unset($tab[$value]); return true;

 } else {
    return false; // the $value is not in the array $tab
 }

}

Saluti

4
angeltcho

Ottieni la chiave con array_search() .

4
evan

OK .. So che questo non è affatto efficiente ma è semplice, intuitivo e facile da leggere.
Quindi, se qualcuno è alla ricerca di una soluzione non così elegante che può essere estesa per lavorare con più valori o condizioni più specifiche ... ecco un semplice codice:

$result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);

foreach($arr as $key =>$value){
    if ($value !== $del_value){
        $result[$key] = $value;
    }

    //if(!in_array($value, $del_values)){
    //    $result[$key] = $value;
    //}

    //if($this->validete($value)){
    //      $result[$key] = $value;
    //}
}

return $result
3
d.raev

Se i valori che si desidera eliminare sono o possono essere in una matrice. Usa la funzione array_diff. Sembra funzionare bene per cose come questa.

array_diff

$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
3
user1518699

Secondo il tuo requisito " ogni valore può essere presente una sola volta " se sei solo interessato a mantenere valori univoci nel tuo array, quindi il array_unique() potrebbe essere quello che stai cercando.

Ingresso:

$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);

Risultato:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}
3
Mohd Abdul Mujib

La risposta accettata converte l'array in array associativo, quindi, se si desidera mantenerlo come array non associativo con la risposta accettata, potrebbe essere necessario utilizzare anche array_values.

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

Il riferimento è qui

3
SaidbakR

Se non conosci la sua chiave significa che non importa.

Puoi inserire il valore come chiave, significa che troverà istantaneamente il valore. Meglio della ricerca di tutti gli elementi più e più volte.

$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed
2
Ismael

O un one-liner usando l'operatore or:

($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
2
Eric

puoi fare riferimento a questo URL : per la funzione

array-diff-key()

<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_diff_key($array1, $array2));
?>

Quindi l'output dovrebbe essere,

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}
1
manish1706

Un'altra idea per eliminare un valore di un array, usa array_diff. Se voglio

$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));

(Doc: http://php.net/manual/fr/function.array-diff.php )

0
Dana