web-dev-qa-db-fra.com

PHP tableau supprimé par valeur (pas clé)

J'ai un tableau PHP comme suit:

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

Je souhaite supprimer l'élément contenant la valeur $del_val (par exemple, $del_val=401), mais je ne connais 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.

797
Adam Strudwick

En utilisant 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 trouvé, qui peut être utilisé pour supprimer cet élément du tableau d'origine à l'aide de unset(). Il renverra FALSE en cas d'échec. Toutefois, il peut renvoyer une valeur false-y en cas de succès (votre clé peut être 0 par exemple), raison pour laquelle l'opérateur de comparaison stricte !== est utilisé.

L'instruction if() vérifiera si array_search() a renvoyé une valeur et n'exécutera une action que si elle le faisait.

1427
Bojangles

Eh bien, la suppression d’un élément d’un tableau se résume essentiellement à 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 supprimer autant d’éléments que vous le souhaitez en même temps, si vous le souhaitez.

Clause de non-responsabilité: Notez que ma solution produit une nouvelle copie du tableau tout en conservant l’ancienne intacte, contrairement à la réponse acceptée qui mute. Choisissez celui dont vous avez besoin.

587
Rok Kralj

Une méthode intéressante consiste à utiliser array_keys() :

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

La fonction array_keys() requiert deux paramètres supplémentaires pour renvoyer uniquement les clés correspondant à une valeur particulière et si un contrôle strict est requis (c'est-à-dire, utiliser === pour la comparaison).

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

103
Ja͢ck

Si vous savez que votre tableau ne contiendra qu'un seul élément avec cette valeur, vous pouvez faire

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

Si, toutefois, votre valeur peut apparaître plusieurs fois dans votre tableau, vous pouvez le faire.

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

Remarque: La deuxième option ne fonctionne que pour PHP 5.3 + avec Fermetures

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

Regardez le code suivant:

$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 cela vous donnera ce tableau:

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

Le meilleur moyen est array_splice

_array_splice($array, array_search(58, $array ), 1);
_

Reason for Best est ici à l'adresse http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-ararray-in -php/

21

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

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

19
Syed Abidur Rahman

Ou simplement, de manière 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 tableau

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

sortie

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

12
tttony

Si vous avez PHP 5.3+, il y a un code d'une ligne:

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

tu peux faire:

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

Explication: Supprimez l'élément contenant la clé 401 après avoir retourné le tableau.

7
Qurashi

Pour supprimer plusieurs valeurs, essayez celui-ci:

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

Emprunte la logique de underscore.JS _.reject et crée deux fonctions (les gens préfèrent les fonctions !!)

array_reject_value: Cette fonction rejette simplement la valeur spécifiée (fonctionne également 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 appelable (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 même mieux: (car cela nous donne une meilleure syntaxe à utiliser comme le array_filter un)

$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 par exemple si nous aimerions supprimer toutes les valeurs 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;
});
4

Réponse de Bojangles m'a aidé. Je vous remercie.

Dans mon cas, le tableau peut être associatif ou non, j'ai donc ajouté la fonction suivante

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
 }

}

Cordialement

3
angeltcho

code de ligne unique (grâce à array_diff () ), utilisez ce qui suit:

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

Je sais que ce n’est pas efficace du tout mais qu’il est simple, intuitif et facile à lire.
Donc, si quelqu'un recherche une solution peu sophistiquée qui peut être étendue pour fonctionner 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
2
d.raev

Si les valeurs que vous souhaitez supprimer sont ou peuvent figurer dans un tableau. Utilisez la fonction array_diff . Semble fonctionner très bien pour des choses comme ça.

array_diff

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

Selon votre exigence ", chaque valeur ne peut être présente qu'une seule fois " si vous souhaitez simplement conserver des valeurs uniques dans votre tableau, 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"
}
2
Mohd Abdul Mujib

La réponse acceptée convertit le tableau en tableau associatif. Par conséquent, si vous souhaitez le conserver sous forme de tableau non associatif avec la réponse acceptée, vous devrez peut-être également utiliser array_values.

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

La référence est ici

2
SaidbakR

Obtenez la clé du tableau avec array_search() .

2
evan

Si vous ne connaissez pas sa clé, cela signifie que cela n'a pas d'importance.

Vous pouvez placer la valeur comme clé, cela signifie qu'elle trouvera 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
1
Ismael

vous pouvez vous référer à ceci 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));
?>

Alors la sortie devrait être,

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

Une ligne utilisant l'opérateur or:

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

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
Dana