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)?
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.
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]);
}
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()
.
supprimer $rm_val
de $arr
unset($arr[array_search($rm_val, $arr)]);
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;
}
}
_
Essayez array_search ()
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.
sans flip:
<?php
foreach ($items as $key => $value) {
if ($id === $value) {
unset($items[$key]);
}
}
Vous pouvez utiliser la fonction array_splice pour cette opération. Ref: array_splice
array_splice($array, array_search(58, $array ), 1);
function deleteValyeFromArray($array,$value)
{
foreach($array as $key=>$val)
{
if($val == $value)
{
unset($array[$key]);
}
}
return $array;
}