Comment supprimer l'élément de tableau puis réindexer le tableau?


206

J'ai des problèmes avec un tableau. J'ai un tableau que je souhaite modifier comme ci-dessous. Je veux supprimer un ou plusieurs éléments de celui-ci par index puis réindexer le tableau. C'est possible?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Réponses:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
C'est exactement ce que je voulais publier, +1.
Michiel Pater

4
C'est mieux que la solution de deceze si plusieurs éléments doivent être supprimés en même temps - si les index de ces éléments sont collectés au préalable. Une fois que vous utilisez array_splice sur le premier élément, vous perdez les index des autres éléments.
Jānis Elmeris

23
Il convient de noter que vous pouvez désactiver plusieurs variables / index de tableau en un seul appel non unset($foo[0], $foo[3], $bar[1]);
défini

très belle solution bro :)
Michael Kisilenko

J'ai utilisé ça. Je vous remercie. J'utilisais array_splice, et cela n'a pas fonctionné pour les 0-ème et 1er indices.
theGreenCabbage


29

Vous feriez mieux d'utiliser array_shift(). Cela renverra le premier élément du tableau, le supprimera du tableau et réindexera le tableau. Tout en une méthode efficace.


2
C'est très bien lorsque vous souhaitez récupérer, puis supprimer le premier élément du tableau, réindexant le tableau dans le processus. Sa fonction homologue array_pop()récupérera et supprimera le dernier élément du tableau si vous en avez besoin. Mais, aucune fonction ne peut être faite pour agir sur un élément au milieu du tableau.
Derrick Miller

1
Bien que cela soit orthogonalement lié, la question concerne explicitement tout élément d'un tableau, pas seulement le premier.
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

Je ne sais pas pourquoi cela fait l'objet d'un vote négatif, mais si quelqu'un a pris la peine de l'essayer, vous remarquerez que cela fonctionne. L'utilisation du tri sur un tableau réaffecte les clés du tableau. Le seul inconvénient est qu'il trie les valeurs. Étant donné que les clés seront évidemment réaffectées, même avec array_values, peu importe que les valeurs soient triées ou non.


9
même si les clés seront réaffectées, dans la bonne réponse, l'ordre initial sera conservé.
s3v3n

1
"Je veux en supprimer un ou plusieurs éléments par index puis réindexer le tableau. Est-ce possible?" @ s3v3n L'OP n'a jamais demandé le maintien de l'ordre initial. J'ai simplement fourni une solution qui fonctionne et fait ce qui est indiqué.
frostymarvelous

1
La question a 2 ans. Laisser aller!
s3v3n

@ s3v3n Ce n'est pas une rancune. Je veux juste savoir pourquoi. De toute évidence, pour améliorer dans les réponses ultérieures. Je suis d'accord qu'il existe de meilleures méthodes, mais y a-t-il une raison pour laquelle cette réponse est si mauvaise? Est-ce la performance? etc? Même raison pour laquelle je suis sur SO, pour apprendre aussi bien qu'enseigner.
frostymarvelous

Dans des circonstances normales, il est très probable que le programmeur aura besoin de ces valeurs exactement dans le même ordre que l'entrée. Prenons comme exemple quelques lignes de la base de données qui devraient être affichées dans un tableau; ou une application de chat où les réponses doivent être exactement dans le même ordre. Le nombre d'exemples peut être infini, le fait est que dans la plupart des cas, l'ordre doit être le même ou au moins le programmeur s'attendrait au même ordre des éléments dans le tableau.
s3v3n

4

Essayez avec:

$foo2 = array_slice($foo, 1);

Cela ne fonctionne que pour le premier élément et non arbitraire.
Felix Kling

0

En plus de la réponse de xzyfer

La fonction

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

Utilisation

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Résultat

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.