web-dev-qa-db-fra.com

php array_Push () -> Comment ne pas pousser si le tableau contient déjà la valeur

J'utilise la boucle suivante pour ajouter des éléments à un tableau de la liste appelé $ liste. Je voudrais savoir s'il est possible de ne pas ajouter $ value au tableau $ liste si la valeur est déjà dans le tableau? J'espère que je suis clair. Merci d'avance.

$liste = array();
foreach($something as $value){
     array_Push($liste, $value);
}
33
Marc

Vous vérifiez si c'est là, en utilisant in_array , avant d'appuyer.

foreach($something as $value){
    if(!in_array($value, $liste, true)){
        array_Push($liste, $value);
    }
}

Le ,true permet la "vérification stricte". Ceci compare les éléments en utilisant === au lieu de ==.

73
Rocket Hazmat

Deux options vraiment.

Option 1: Vérifiez chaque élément et n'appuyez pas sur l'élément. Fondamentalement, ce que vous demandez:

foreach($something as $value) {
    if( !in_array($value,$liste)) array_Push($liste,$value);
}

Option 2: Ajoutez-les quand même et supprimez les doublons après:

foreach($something as $value) {
    array_Push($liste,$value);
}
$liste = array_unique($liste);

Cependant, il se peut que vous recherchiez simplement $liste = array_unique($something);.

18

Comme cette question utilise au départ pas le code de bonne pratique, je trouve toutes les réponses trop compliquées.

Code de résolution en question:

Fondamentalement, ce que l’on essaie de faire dans la question elle-même consiste à filtrer les répétitions. Meilleure approche: 

$liste = array_unique($something);

Si vous ajoutez des éléments à un tableau qui n'est pas vide:

$liste = array_unique(array_merge($liste, $something));

Si vous utilisez array_Push ():

Sauf si vous utilisez réellement la valeur de retour de array Push, vous devriez vraiment utiliser:

$liste[] = $value;

pour une syntaxe plus courte et une augmentation mineure des performances

3
NoOorZ24

peut-être voudrez-vous plutôt l’utiliser comme un tableau associatif. c'est implémenté comme (quelque chose comme) une table de hachage , donc vous obtenez __ un temps d'insertion constant au lieu de linéaire.

function find_uniq( $something ) {
    foreach($something as $value){
         $liste[$value]++;
    }
    return array_keys( $liste );
}
3
bjelli

Vous pouvez simplement vérifier cette condition avant d'appeler array_Push(). Utilisez array_search() et utilisez une comparaison solide avec false pour voir si la valeur est présente: 

foreach( $something as $value ){
    if( array_search( $value, $liste, true ) === false ){
        array_Push( $liste, $value );
    }
}

(Au fait: ajoutez ,true à array_search pour utiliser le "contrôle strict". Ceci utilisera === pour les comparaisons au lieu de ==)

3
Jazz

Économisez de la logique et améliorez votre vitesse en la maintenant sans logique. Continuez simplement à écraser.

$list = array();
foreach ($something as $value) {
  if (!is_object($value) && !is_array($value)) {
    $list[$value] = $value
  }
}
$list = array_values($list);
1
doublejosh

La bonne réponse est beaucoup plus simple. Appuyez sur tout, mais utilisez ensuite la fonction array_unique():

array_Push($array, $new_member);
$array = array_unique($array);
0
Nick

Les bonnes réponses sont déjà présentes ci-dessus, mais si vous avez plusieurs array_Push () dans tout votre code, il serait difficile d’écrire à chaque fois si (in_array ()).

Voici une solution qui raccourcira votre code pour ce cas: Utilisez une fonction distincte.

function arr_inserter($arr,$add){ //to prevent duplicate when inserting
    if(!in_array($add,$arr))
        array_Push($arr,$add);
    return $arr;
}

Ensuite, dans tous vos besoins array_Push (), vous pouvez appeler cette fonction ci-dessus, comme ceci:

$liste = array();
foreach($something as $value){
    $liste = arr_inserter($liste, $value);
}

Si $ value est déjà présent, $ liste reste inchangé.

Si $ value n'est pas encore présente, elle est ajoutée à $ liste.

J'espère que cela pourra aider.

0
ITWitch