J'ai le tableau suivant, que je voudrais réindexer pour que les clés soient inversées (idéalement à partir de 1):
Tableau actuel ( modifier: le tableau ressemble en fait à ceci):
Array (
[2] => Object
(
[title] => Section
[linked] => 1
)
[1] => Object
(
[title] => Sub-Section
[linked] => 1
)
[0] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Comment ça devrait être:
Array (
[1] => Object
(
[title] => Section
[linked] => 1
)
[2] => Object
(
[title] => Sub-Section
[linked] => 1
)
[3] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Réponses:
Si vous souhaitez réindexer à partir de zéro, procédez comme suit:
Si vous en avez besoin pour commencer à un, utilisez ce qui suit:
Voici les pages de manuel des fonctions utilisées:
array_values()
array_combine()
range()
la source
array_values
renvoie une copie du tableau. Donc, si vous avez des références au tableau, cearray_splice
serait mieux. Voir la solution @imagiro.array_values()
faites fonctionner que si vous commencez avec l'index 0 tout le temps.Voici le meilleur moyen :
qui retourne
en faisant cela
tu comprends ça
Explication
array_values()
: Renvoie les valeurs du tableau d'entrée et les indexes numériquement.array_filter()
: Filtre les éléments d'un tableau avec une fonction définie par l'utilisateur (UDF si aucune n'est fournie , toutes les entrées de la table d'entrée valant FALSE seront supprimées .)la source
array_filter()
semble totalement sans rapport avec les données de l'échantillon.Je viens de découvrir que tu peux aussi faire un
Cela fait la réindexation en place, donc vous ne vous retrouvez pas avec une copie du tableau d'origine.
la source
Pourquoi réindexer? Ajoutez simplement 1 à l'index:
Modifier Une fois la question clarifiée: vous pouvez utiliser le
array_values
pour réinitialiser l'index à partir de 0. Ensuite, vous pouvez utiliser l'algorithme ci-dessus si vous voulez juste que les éléments imprimés commencent à 1.la source
Eh bien, j'aimerais penser que quel que soit votre objectif final, vous n'aurez pas besoin de modifier le tableau pour qu'il soit basé sur 1 plutôt que sur 0, mais vous pourriez plutôt le gérer au moment de l'itération, comme l'a publié Gumbo.
Cependant , pour répondre à votre question, cette fonction doit convertir n'importe quel tableau en une version basée sur 1
ÉDITER
Voici une fonction plus réutilisable / flexible, si vous le désirez
la source
Cela fera ce que vous voulez:
la source
Vous voudrez peut-être vous demander pourquoi vous souhaitez utiliser un tableau basé sur 1. Les tableaux de base zéro (lors de l'utilisation de tableaux non associatifs) sont assez standard, et si vous souhaitez générer une sortie vers une interface utilisateur, la plupart géreraient la solution en augmentant simplement l'entier lors de la sortie vers l'interface utilisateur.
Pensez à la cohérence - à la fois dans votre application et dans le code avec lequel vous travaillez - lorsque vous pensez aux indexeurs basés sur 1 pour les tableaux.
la source
Une solution plus élégante:
la source
Vous pouvez réindexer un tableau pour que le nouveau tableau commence par un index de 1 comme ceci;
La sortie de ce qui précède est;
la source
array_values
ici. Voyez ma réponse.Similaire à @monowerker, j'avais besoin de réindexer un tableau en utilisant la clé d'un objet ...
Cela a abouti à:
la source
la source
Si vous n'essayez pas de réorganiser la baie, vous pouvez simplement faire:
$ tableau = tableau_reverse ($ tableau);
$ tableau = tableau_reverse ($ tableau);
Le array_reverse est très rapide et il se réorganise au fur et à mesure qu'il s'inverse. Quelqu'un d'autre m'a montré cela il y a longtemps. Je ne peux donc pas m'attribuer le mérite de l'avoir inventé. Mais c'est très simple et rapide.
la source
Semblable à la contribution de Nick, je suis venu à la même solution pour réindexer un tableau, mais j'ai un peu amélioré la fonction car à partir de la version 5.4 de PHP, cela ne fonctionne pas à cause du passage de variables par référence. Un exemple de fonction de réindexation est alors comme ceci en utilisant la
use
fermeture de mot-clé:la source
Voici ma propre implémentation. Les clés du tableau d'entrée seront renumérotées avec des clés incrémentées à partir de $ start_index.
la source
Faites simplement ceci:
la source
Vous pouvez facilement le faire après avoir utilisé les fonctions array_values () et array_filter () ensemble pour supprimer les éléments de tableau vides et réindexer un tableau en PHP.
Fonction array_filter () La fonction PHP array_filter () supprime les éléments de tableau vides ou les valeurs d'un tableau en PHP. Cela supprimera également les valeurs vides, nulles, fausses, 0 (zéro).
Fonction array_values () La fonction PHP array_values () renvoie un tableau contenant toutes les valeurs d'un tableau. Le tableau retourné aura des touches numériques, commençant à 0 et augmentées de 1.
Supprimer les éléments de tableau vides et réindexer
Voyons d'abord la sortie du tableau $ stack:
Production:
Dans la sortie ci-dessus, nous voulons supprimer les valeurs vides, nulles, 0 (zéro), puis réindexer les éléments du tableau. Nous allons maintenant utiliser les fonctions array_values () et array_filter () ensemble comme dans l'exemple ci-dessous:
Production:
la source
array_filter()
semble totalement sans rapport avec les exemples de données du PO.Dupliquer la suppression et réindexer un tableau:
la source
array_filter()
semble totalement hors de propos pour les données d'échantillon du PO.Le moyen le plus rapide auquel je puisse penser
Et si vous voulez juste réindexer le tableau (commencez à zéro) et que vous avez PHP +7.3, vous pouvez le faire de cette façon
Je crois que
array_unshift
c'est mieux quearray_values
car le premier ne crée pas de copie du tableau.la source
On a l'impression que toutes les
array_combine()
réponses copient toutes la même «erreur» (l'appel inutile dearray_values()
).array_combine()
ignore les clés des deux paramètres qu'il reçoit.Code: ( Démo )
Production:
la source
Le tri est juste un tri () , la réindexation semble un peu ridicule mais si c'est nécessaire, cela le fera. Bien que pas en place. Utilisez array_walk () si vous voulez faire cela dans un tas d'endroits, utilisez simplement une boucle for-key-value s'il s'agit d'une opération ponctuelle.
la source
Si vous pouvez créer un nouveau tableau, c'est ceci:
Si vous avez besoin d'une inversion sur place, vous devez exécuter à l'envers afin de ne pas piétiner les index dont vous avez besoin:
la source
array_values()
pour obtenir un tableau basé sur 0, puis à ajuster ce résultat si un tableau basé sur 1 est vraiment nécessaire.