171 votes

Suppression de l'élément de tableau par valeur

J'ai besoin de 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)?

426voto

Alejandro Iglesias Points 7779

Cela peut être accompli avec une simple doublure.

Ayant 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 de beaux codes.

37voto

zombat Points 46702

J'ajoute une seconde réponse. J'ai écrit un script d'évaluation 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
 

À en juger par la suite, la solution que j'utiliserais alors serait:

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

31voto

zombat Points 46702

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 une perte de clé, qui est un effet secondaire de array_flip() .

17voto

Toma Points 41

supprimer $rm_val de $arr

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

8voto

Pascal MARTIN Points 195780

La solution la plus puissante consisterait à utiliser array_filter , ce 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;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X