Tableau PHP supprimer par la valeur (pas la clé)

j'ai un tableau PHP comme suit:

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

je veux supprimer l'élément contenant la valeur $del_val (par exemple, $del_val=401 ), mais je ne sais pas sa clé. Cela pourrait aider: chaque valeur ne peut être là qu'une fois .

je cherche la fonction la plus simple pour effectuer cette tâche s'il vous plaît.

689
demandé sur Rok Kralj 2011-08-29 04:44:04
la source

25 ответов

par array_search() et unset , essayez ce qui suit:

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

array_search() renvoie la clé de l'élément qu'il trouve, qui peut être utilisée pour supprimer cet élément du tableau original en utilisant unset() . Il retournera FALSE à l'échec, mais il peut retourner une valeur fausse - y sur le succès (votre clé peut être 0 par exemple), c'est pourquoi la comparaison stricte !== l'opérateur est utilisé.

l'instruction if() vérifiera si array_search() a retourné une valeur, et n'effectuera une action que si elle l'a fait.

1271
répondu Bojangles 2017-10-18 13:42:30
la source

supprimer un élément d'un tableau n'est en fait qu'une simple différence avec un élément.

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

il généralise bien, vous pouvez enlever autant d'éléments que vous voulez en même temps, si vous voulez.

clause de non-responsabilité: notez que ma solution produit une nouvelle copie de la matrice tout en gardant l'ancienne intacte en contraste avec la réponse acceptée qui mute. Il pourrait être un peu plus lent à cause de cela.

492
répondu Rok Kralj 2018-02-25 13:16:37
la source

une façon intéressante est d'utiliser array_keys() :

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

la fonction array_keys() prend deux paramètres supplémentaires pour retourner Seulement les clés pour une valeur particulière et si un contrôle strict est nécessaire (c.-à-d. en utilisant === pour la comparaison).

cela peut également supprimer plusieurs éléments de tableau avec la même valeur (par exemple [1, 2, 3, 3, 4] ).

98
répondu Ja͢ck 2014-01-14 10:48:23
la source

Si vous savez pour certain que votre tableau contient un seul élément avec cette valeur, vous pouvez faire

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

si, cependant, votre valeur peut apparaître plus d'une fois dans votre tableau, vous pouvez le faire

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

Note: la deuxième option ne fonctionne que pour PHP5.3 + avec fermetures

44
répondu adlawson 2014-08-08 06:58:46
la source
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
36
répondu Rmannn 2012-08-01 21:26:59
la source

regardez le code suivant:

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

Vous pouvez le faire:

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

et qui vous obtiendra ce tableau:

array('nice_item', 'another_liked_item')
23
répondu theCodeMachine 2013-03-16 16:47:15
la source

par le code suivant, les valeurs répétitives seront supprimées des messages$.

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

19
répondu Syed Abidur Rahman 2014-01-02 07:33:42
la source

le meilleur moyen est array_splice

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

la raison de Best est ici à http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php /

19
répondu Abdul Jabbar Dumrai 2017-01-26 09:17:19
la source

Ou, simplement, de façon manuelle:

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

C'est le plus sûr d'entre eux parce que vous avez le contrôle total sur votre réseau

16
répondu Victor Priceputu 2015-09-22 22:03:32
la source
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);

Sortie

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

10
répondu tttony 2011-08-29 06:19:07
la source

pour supprimer plusieurs valeurs essayez celle-ci

while (($key = array_search($del_val, $messages)) !== false) 
{
    unset($messages[$key]);
}
8
répondu Rajendra Khabiya 2015-01-15 09:47:25
la source

vous pouvez le faire:

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

explication: Supprimer l'élément qui a la touche 401 après avoir retourné le tableau.

8
répondu Qurashi 2015-04-09 11:50:06
la source

si vous avez > php5.3, Il y a le code d'une ligne:

$array = array_filter($array, function($i) use ($value){return $i != $value;}); 
8
répondu David Lin 2016-10-05 07:34:34
la source

emprunte la logique de underlorejs _.rejeter et créé deux fonctions (les gens préfèrent les fonctions!!)

array_reject_value: cette fonction rejette simplement la valeur spécifiée (fonctionne aussi pour 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: cette fonction rejette simplement la méthode callable (fonctionne pour 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;
}

donc dans notre exemple actuel nous pouvons utiliser les fonctions ci-dessus comme suit:

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

ou encore mieux: (comme cela nous donne une meilleure syntaxe à utiliser comme le array_filter )

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

ce qui précède peut être utilisé pour des choses plus compliquées comme disons que nous aimerions supprimer toutes les valeurs qui sont supérieures ou égales à 401 nous pourrions simplement faire ceci:

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});
6
répondu John Skoumbourdis 2016-10-24 22:18:17
la source

@Bojangles réponse m'a aidé. Remercier.

dans mon cas, le tableau pourrait être associatif ou non, donc j'ai ajouté cette fonction

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
 }

}

concerne

5
répondu angeltcho 2014-03-04 15:32:05
la source

obtenir la clé avec array_search() .

4
répondu evan 2011-08-29 04:47:09
la source

Si vos valeurs que vous souhaitez supprimer, sont ou peuvent, être dans un tableau. Utilisez la fonction array_diff. Ça a l'air de marcher pour des choses comme ça.

array_diff

$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
3
répondu user1518699 2013-11-09 03:56:34
la source

OK.. Je sais que ce n'est pas efficace du tout, mais est simple, intuitive et facile à lire.

Donc, si quelqu'un est à la recherche d'une solution pas si fantaisiste qui peut être étendue pour travailler avec plus de valeurs, ou des conditions plus spécifiques .. voici un code simple:

$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
répondu d.raev 2015-02-05 19:22:46
la source

si vous ne connaissez pas sa clé, cela signifie qu'elle n'a pas d'importance.

vous pouvez placer la valeur comme la clé, cela signifie qu'il va trouver instantanément la valeur. Mieux que d'utiliser la recherche dans tous les éléments, encore et encore.

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

unset($messages[3]); // no search needed
3
répondu Ismael 2016-01-25 13:28:40
la source

selon votre exigence " chaque valeur ne peut être là qu'une seule fois "si vous êtes simplement intéressé à garder des valeurs uniques dans votre tableau, alors le array_unique() pourrait être ce que vous recherchez.

Entrée:

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

résultat:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}
3
répondu Mohd Abdul Mujib 2016-10-12 15:27:27
la source

ou une doublure unique utilisant l'opérateur or :

($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
2
répondu Eric 2013-09-13 04:43:08
la source

la réponse acceptée, convertit le tableau en tableau associatif, donc, si vous souhaitez le garder comme tableau non associatif avec la réponse acceptée, vous pouvez avoir à utiliser array_values aussi.

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

la référence est ici

2
répondu SaidbakR 2017-05-23 15:26:36
la source

vous pouvez rapporter ce URL : pour la fonction

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));
?>

Puis sortie doit être,

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}
1
répondu manish1706 2016-09-21 09:12:37
la source

single liner code (merci à array_diff () ), utilisez le code suivant:

$messages = array_diff($messages, array(401));
1
répondu Star 2018-01-29 14:13:37
la source

une Autre idée pour supprimer une valeur d'un tableau, utilisez array_diff. Si je veux

$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
répondu Dana 2013-09-24 21:17:54
la source

Autres questions sur php arrays