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]

);
daGrevis
la source

Réponses:

456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
xzyfer
la source
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
43
array_splice($array, 0, 1);

http://php.net/manual/en/function.array-splice.php

décomposer
la source
2
Méfiez-vous de l'utiliser dans une boucle car cela met les indices de tableau de la boucle et du tableau réel hors de synchronisation.
Mouagip
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.

René
la source
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
10
array_splice($array, array_search(array_value, $array), 1);
user1092222
la source
où array_value sera «n'importe quoi»
user1092222
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.

givré
la source
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);
hsz
la source
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"
  }
RafaSashi
la source
0

Si vous utilisez array_merge, cela réindexera les clés. Le manuel indique:

Les valeurs dans le tableau d'entrée avec des touches numériques seront renumérotées avec des clés d'incrémentation à partir de zéro dans le tableau de résultats.

http://php.net/manual/en/function.array-merge.php

C'est là que j'ai trouvé la réponse originale.

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset ()

Richard Skinner
la source