PHP: Comment supprimer un élément spécifique d'un tableau?

160

Comment supprimer un élément d'un tableau lorsque je connais le nom des éléments? par exemple:

J'ai un tableau:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

l'utilisateur entre strawberry

strawberry est retiré.

Pour bien expliquer:

J'ai une base de données qui stocke une liste d'éléments séparés par une virgule. Le code extrait la liste en fonction d'un choix de l'utilisateur où se trouve ce choix. Donc, s'ils choisissent fraise, le code extrait chaque entrée où la fraise est localisée, puis le convertit en un tableau en utilisant split (). Je veux leur supprimer les éléments choisis par l'utilisateur, pour cet exemple la fraise, du tableau.

dcp3450
la source
4
Même question: stackoverflow.com/questions/7225070/…
trante
1
Encore une même question: stackoverflow.com/questions/1883421/…
Eric Lavoie
1
plus même question: stackoverflow.com/questions/369602/…
Alex

Réponses:

296

Utilisez array_searchpour obtenir la clé et la retirer avec unsetsi elle est trouvée:

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

array_searchrenvoie false ( null jusqu'à PHP 4.2.0) si aucun élément n'a été trouvé.

Et s'il peut y avoir plusieurs éléments avec la même valeur, vous pouvez utiliser array_keyspour obtenir les clés de tous les éléments:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}
Gombo
la source
Obtenir un résultat étrange. J'ai utilisé votre première suggestion car il n'y aura toujours qu'une seule instance. Pour le tester, je lui ai simplement demandé de sortir la valeur de la clé. Travaillé. Cependant, il ne se désarmera pas.
dcp3450
1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "submenus"); $ submenuArray = split (',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {unset ($ submenuArray [$ key]); }}
dcp3450
@ dcp3450: Et que faites-vous avec $submenuArray? (Notez que chaque boucle $submenuArraysera écrasée.)
Gumbo
J'ai mis à jour ma question pour mieux expliquer. Fondamentalement, le code parcourt les entrées d'une base de données en supprimant les éléments choisis, "fraise" dans cet exemple. Ainsi, l'utilisateur entre une sélection => le code recherche dans les sous-menus et trouve toute liste qui a cette option => transforme cette liste en un tableau => supprime l'option choisie.
dcp3450
1
J? ai compris! Je ne réécrivais pas le nouveau tableau dans la base de données. Il est facile de rater des choses lorsque vous regardez le code pendant si longtemps.
dcp3450
153

Utiliser array_diff()pour une solution à 1 ligne:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Pas besoin de fonctions supplémentaires ou de boucle foreach.

maux
la source
8
Cette solution est bien plus lisible que les meilleures.
Robbert
Bien que if strawberryne soit pas dans le tableau initial, il deviendra disponible dans le $array_without_strawberriestableau - code dangereux si vous voulez vous assurer qu'un élément donné n'est pas dans un tableau.
Erfan
5
@Erfan Votre affirmation est fausse. $a = array_diff(array(), array('strawberry'));- $ a est un tableau vide.
bancer
1
Vous avez raison @bancer - je pensais probablement à array_intersect ou quelque chose comme ça.
Erfan
1
array_diff () est plus élégant que la réponse marquée.
Dom DaFonte
36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
John Conde
la source
2
Vous devriez tester si la fraise est du tout dans le tableau.
Gumbo
Suite aux conseils de Gumbo, la réponse a été modifiée pour inclure la vérification de l'élément avant de le supprimer du tableau.
John Conde
2
Gardez également à l'esprit que les indices ne sont pas réalignés après la suppression d'un élément particulier. En d'autres termes, la séquence d'index aura alors des lacunes. Si vous supprimez «fraise» de votre exemple, «kiwi» aura toujours l'index 4 et l'index 2 disparaîtra simplement. Il est important que votre code repose sur l'exhaustivité de la séquence d'index, comme par exemple pour les boucles ($ i = 0; $ i <.., $ i ++).
the-banana-king
2
Pour ajouter à ce que dit the-banana-king, si vous voulez réindexer le tableau, faites simplement $my_array = array_values($my_array);.
ryeguy
2
Bien que cette solution soit correcte, elle recherche le tableau DEUX FOIS ( in_arrayet array_search). Utiliser le retour de array_searchcomme dans la réponse de Gumbo est plus efficace
Bogdan D
21

Si vous utilisez un tableau simple ici (ce qui semble être le cas), vous devriez utiliser ce code à la place:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) supprime uniquement l'élément mais ne réorganise pas le tableau simple.

Supposons que nous ayons un tableau et que nous utilisions array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

Comparé à unset:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Remarquez comment unset($array[$key])ne réorganise pas le tableau.

ericluwj
la source
Officiellement unsetne renvoie rien. Ce json_encode(unset($array[2]))n'est donc pas approprié pour une comparaison.
robsch
c'est exactement ce dont j'ai besoin, merci à ericluwj
ana
12

Vous pouvez utiliser un filtre de tableau pour supprimer les éléments selon une condition spécifique sur $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});
srcspider
la source
Voter contre. Cette qualité médiocre (car il s'agit d'une réponse de code uniquement et donne une erreur d'analyse) est un double de la méthode de D.Martin qui utilise simplement une fonction anonyme à l'intérieur array_filter(). Bien que j'utilise personnellement une fonction anonyme dans ma mise en œuvre, je pense que la bonne action sur SO serait de commenter ou de modifier la réponse de D.Martin si vous souhaitez apporter une micro-amélioration afin que cette page ne devienne pas gonflée. Veuillez supprimer cette réponse en double.
mickmackusa
4

Sera comme ça:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");
D.Martin
la source
4

Il s'agit d'une simple réitération qui peut supprimer plusieurs valeurs du tableau.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }
mmr
la source
Il s'agit d'un remplacement inefficace et inefficace de ce que les développeurs de PHP ont déjà créé array_diff(). Comment cela a-t-il obtenu trois votes positifs. Personne ne devrait trouver cette réponse utile ou l'utiliser dans ses propres projets. Je recommande de supprimer cette réponse - cela permettrait de libérer votre compte d'une réponse de mauvaise qualité, de réduire le nombre de réponses sur cette page et de vous gagner un badge Discipliné. Je vais reporter mon vote défavorable afin que vous ayez le temps de supprimer pour une récompense.
mickmackusa
4

Juste vous pouvez faire une seule ligne. Ce sera supprimer l'élément du tableau


$array=array_diff($array,['strawberry']);

dılo sürücü
la source
3

J'utilise actuellement cette fonction:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

Vous pouvez saisir un tableau ou seulement une chaîne avec le ou les éléments à supprimer. Écrivez-le comme ceci:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

OU

$detils = array_delete('orange', $detils);

Il le réindexera également.

jankal
la source
2
C'est horriblement compliqué et fou. Comment cela a-t-il gagné 3 votes positifs?!?
mickmackusa
2

Cette question a plusieurs réponses mais je veux ajouter quelque chose de plus car lorsque j'ai utilisé unsetou array_diffj'ai eu plusieurs problèmes pour jouer avec les index du nouveau tableau lorsque l'élément spécifique a été supprimé (car les index initiaux sont enregistrés)

Je reviens à l'exemple:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

ou

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Si vous imprimez le résultat, vous obtiendrez:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Résultat :

> apple
> orange
> blueberry
> kiwi

Mais les index seront enregistrés et vous aurez donc accès à votre élément comme:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

Et donc le tableau final n'est pas réindexé. Vous devez donc ajouter après le unsetou array_diff:

$array_without_strawberries = array_values($array);

Après cela, votre tableau aura un index normal:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

Lié à cet article: Réindexer le tableau

entrez la description de l'image ici

J'espère que cela aidera

Jordan Montel
la source
1

Une meilleure approche serait peut-être de conserver vos valeurs sous forme de clés dans un tableau associatif, puis de l'appeler array_keys()lorsque vous voulez un tableau réel. De cette façon, vous n'avez pas besoin d'utiliser array_searchpour trouver votre élément.

jishi
la source
1
Votre message est un commentaire et non une réponse. Veuillez supprimer et publier sous la question elle-même.
mickmackusa
1

La réponse à la suppression du tableau PHP par valeur (pas par clé) donnée par https://stackoverflow.com/users/924109/rok-kralj

L'OMI est la meilleure réponse car elle supprime et ne mute pas

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

Cela se généralise bien, vous pouvez supprimer autant d'éléments que vous le souhaitez en même temps, si vous le souhaitez.

Avertissement: Notez que ma solution produit une nouvelle copie du tableau tout en gardant l'ancien intact contrairement à la réponse acceptée qui mute. Cela pourrait être un peu plus lent à cause de cela.

traqué
la source
1

Je cherchais la réponse à la même question et suis tombé sur ce sujet. Je vois deux manières principales: la combinaison de array_search& unsetet l'utilisation de array_diff. À première vue, il m'a semblé que la première méthode serait plus rapide, puisqu'elle ne nécessite pas la création d'un tableau supplémentaire (comme lors de l'utilisation array_diff). Mais j'ai écrit un petit benchmark et je me suis assuré que la deuxième méthode est non seulement plus concise, mais aussi plus rapide! Heureux de partager cela avec vous. :)

https://glot.io/snippets/f6ow6biaol

ПЭХАПЭШНИК
la source
0

Je préférerais utiliser array_key_exists pour rechercher des clés dans des tableaux comme:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

pour trouver efficacement le spécifié, car array_search et in_array () ne fonctionnent pas ici. Et supprimez des trucs avec unset () .

Je pense que cela aidera quelqu'un.

Ddsultan
la source
0

Créer un tableau numérique avec supprimer une valeur de tableau particulière

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Vous pouvez renvoyer ce lien.

Manik Sashtha
la source
Voter contre. La question demande clairement de supprimer une valeur basée sur la valeur (pas la clé). Cette réponse est inutile, veuillez la supprimer.
mickmackusa
0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}
Krishna Jonnalagadda
la source
Cette réponse ne supprime même pas l'option requise.
Nigel Ren
-1

En utilisant array_seach(), 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 d'origine en utilisant unset() . Il reviendra FALSEen cas d'échec, cependant il peut renvoyer une valeur "falsey" en cas de succès (votre clé peut être 0par exemple), c'est pourquoi la comparaison stricte!== opérateur de est utilisé.

L' if()instruction vérifiera si array_search()une valeur a été renvoyée et n'effectuera une action que si elle l'a fait.

Ravinder Singh
la source
3
Voter contre. Il s'agit d'un duplicata de la méthode de Gumbo (actuellement la solution acceptée) qui a été publiée des années avant la vôtre. Les réponses en double n'ont aucune valeur et ne causent que des ballonnements inutiles. Veuillez supprimer votre réponse. Si vous souhaitez expliquer la réponse de Gumbo, faites
modifiant
-1
unset($array[array_search('strawberry', $array)]);
max li
la source
2
Voter contre. La méthode array_search()- unset()était déjà postée par John Conde des années avant la vôtre. Les réponses en double n'ont aucune valeur pour les lecteurs et sont en fait un inconvénient en raison du temps perdu lors du défilement et de la lecture d'informations redondantes. Veuillez supprimer cette réponse.
mickmackusa
-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
Onome Mine Adamu
la source
2
Vous pouvez améliorer cette réponse en écrivant une phrase ou deux sur a) ce que fait le code, et b) pourquoi vous pensez que c'est une option parmi toutes les autres réponses.
Robin Mackenzie
-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }
Rajendra Rajput
la source
4
En plus de la réponse que vous avez fournie, pensez à fournir une brève explication des raisons et de la manière dont cela résout le problème.
jtate
-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);
user3296940
la source
2
Veuillez également ajouter une explication. Comment cela résout le problème.
Rahil Wazir
votre réponse remplace un élément du tableau par un autre NON pour supprimer un élément
ahmed hamdy
Voter contre. Cette réponse ne fournit pas le résultat attendu. Veuillez supprimer cette réponse incorrecte.
mickmackusa