web-dev-qa-db-fra.com

Supprimer un élément de tableau par valeur

Je dois supprimer un élément de tableau avec une valeur donnée:

if (in_array($id, $items)) {
    $items = array_flip($items);
    unset($items[ $id ]);
    $items = array_flip($items);
}

Pourrait-il être fait de manière plus courte (plus efficace)?

159
Marek

Cela peut être accompli avec une simple doublure.

Avoir ce tableau:

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

Tu peux faire:

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

Et la valeur de $arr sera:

array('Nice_item', 'another_liked_item')

J'espère que ça aide à écrire du beau code.

414

J'ajoute une deuxième réponse. J'ai écrit un script d'analyse comparative rapide pour essayer différentes méthodes ici.

$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
    $arr[$i] = Rand(0,PHP_INT_MAX);
}

shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;

/** 
 * Method 1 - array_search()
 */
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
    unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';

/** 
 * Method 2 - basic loop
 */
$start = microtime(true);
foreach($arr2 as $k => $v) {
    if ($v == 123456) {
        unset($arr2[$k]);
    }
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';

/** 
 * Method 3 - array_keys() with search parameter
 */
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
    unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';

La troisième méthode, array_keys() avec le paramètre de recherche facultatif spécifié, semble être de loin la meilleure méthode. Exemple de sortie:

499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds

A en juger par ceci, la solution que j'utiliserais alors serait:

$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
    unset($items[$k]);
}
37
zombat

Que diriez-vous:

if (($key = array_search($id, $items)) !== false) unset($items[$key]);

ou pour plusieurs valeurs:

while(($key = array_search($id, $items)) !== false) {
    unset($items[$key]);
}

Cela éviterait également la perte de clés, ce qui est un effet secondaire de array_flip().

31
zombat

supprimer $rm_val de $arr

unset($arr[array_search($rm_val, $arr)]);
15
Toma

La solution la plus puissante consisterait à utiliser array_filter , qui vous permet de définir votre propre fonction de filtrage.

Mais certains pourraient dire que c'est un peu exagéré, dans votre situation ...
Une simple boucle foreach pour parcourir le tableau et supprimer l'élément que vous ne voulez pas devrait suffire.

Quelque chose comme ça, dans votre cas, devrait probablement faire l'affaire:

_foreach ($items as $key => $value) {
    if ($value == $id) {
        unset($items[$key]);
        // If you know you only have one line to remove, you can decomment the next line, to stop looping
        //break;
    }
}
_
8
Pascal MARTIN
6
Savageman

Vos solutions ne fonctionnent que si vous avez des valeurs uniques dans votre tableau.

Voir:

<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>

Une meilleure façon serait non définie avec array_search , dans une boucle si nécessaire.

6
Dutow

sans flip:

<?php
foreach ($items as $key => $value) {
    if ($id === $value) {
        unset($items[$key]);
    }
}
5
erenon

Vous pouvez utiliser la fonction array_splice pour cette opération. Ref: array_splice

array_splice($array, array_search(58, $array ), 1);
4
Tejas Soni
function deleteValyeFromArray($array,$value)
{
   foreach($array as $key=>$val)
   {
      if($val == $value)
      {
         unset($array[$key]);
      }
   }
   return $array;
}
4
Suman Biswas