Ich habe das folgende Array, das ich neu indizieren möchte, damit die Schlüssel vertauscht werden (idealerweise ab 1):
Aktuelles Array ( Bearbeiten: Das Array sieht tatsächlich so aus):
Array (
[2] => Object
(
[title] => Section
[linked] => 1
)
[1] => Object
(
[title] => Sub-Section
[linked] => 1
)
[0] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Wie es sein sollte:
Array (
[1] => Object
(
[title] => Section
[linked] => 1
)
[2] => Object
(
[title] => Sub-Section
[linked] => 1
)
[3] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Antworten:
Wenn Sie ab Null neu indizieren möchten, gehen Sie einfach wie folgt vor:
Wenn Sie es benötigen, um um eins zu beginnen, verwenden Sie Folgendes:
Hier sind die Handbuchseiten für die verwendeten Funktionen:
array_values()
array_combine()
range()
quelle
array_values
eine Kopie des Arrays zurückgegeben wird. Wenn Sie also Verweise auf das Array haben, istarray_splice
dies besser. Siehe @ imagiro-Lösung.array_values()
damit es funktioniert, wenn Sie mit dem Index 0 die ganze Zeit starten.Hier ist der beste Weg :
das kehrt zurück
auf diese Weise
Du bekommst das
Erläuterung
array_values()
: Gibt die Werte des Eingabearrays und der Indizes numerisch zurück.array_filter()
: Filtert die Elemente eines Arrays mit einer benutzerdefinierten Funktion (UDF Wenn keine angegeben ist , werden alle Einträge in der Eingabetabelle mit dem Wert FALSE gelöscht .)quelle
array_filter()
scheint für die Beispieldaten völlig irrelevant.Ich habe gerade herausgefunden, dass du auch eine machen kannst
Dadurch wird die Neuindizierung an Ort und Stelle durchgeführt, sodass Sie keine Kopie des ursprünglichen Arrays erhalten.
quelle
Warum neu indizieren? Fügen Sie einfach 1 zum Index hinzu:
Bearbeiten Nachdem die Frage geklärt wurde: Sie können
array_values
den Index mit 0 ab 0 zurücksetzen. Dann können Sie den obigen Algorithmus verwenden, wenn Sie nur möchten, dass gedruckte Elemente bei 1 beginnen.quelle
Nun, ich würde gerne denken, dass Sie das Array für Ihr Endziel nicht so ändern müssten, dass es 1-basiert und nicht 0-basiert ist, sondern es stattdessen zur Iterationszeit wie von Gumbo veröffentlicht behandeln könnten.
Um Ihre Frage zu beantworten, sollte diese Funktion jedoch jedes Array in eine 1-basierte Version konvertieren
BEARBEITEN
Hier ist eine wiederverwendbarere / flexiblere Funktion, falls Sie dies wünschen
quelle
Dies wird tun, was Sie wollen:
quelle
Möglicherweise möchten Sie überlegen, warum Sie überhaupt ein 1-basiertes Array verwenden möchten. Nullbasierte Arrays (bei Verwendung nicht assoziativer Arrays) sind Standard, und wenn Sie auf einer Benutzeroberfläche ausgeben möchten, würden die meisten die Lösung handhaben, indem sie bei der Ausgabe auf der Benutzeroberfläche nur die Ganzzahl erhöhen.
Denken Sie an die Konsistenz - sowohl in Ihrer Anwendung als auch in dem Code, mit dem Sie arbeiten -, wenn Sie an 1-basierte Indexer für Arrays denken.
quelle
Eine elegantere Lösung:
quelle
Sie können ein Array neu indizieren, sodass das neue Array mit einem Index von 1 wie diesem beginnt.
Die Ausgabe von oben ist;
quelle
array_values
. Siehe meine Antwort.Ähnlich wie bei @monowerker musste ich ein Array mit dem Schlüssel eines Objekts neu indizieren ...
Dies führte zu:
quelle
quelle
Wenn Sie nicht versuchen, das Array neu zu ordnen, können Sie einfach Folgendes tun:
$ array = array_reverse ($ array);
$ array = array_reverse ($ array);
Das array_reverse ist sehr schnell und ordnet es beim Umkehren neu. Jemand anderes hat mir das vor langer Zeit gezeigt. Ich kann es mir also nicht vorstellen, dass ich es mir ausgedacht habe. Aber es ist sehr einfach und schnell.
quelle
Ähnlich wie in Nicks Beitrag kam ich zu derselben Lösung für die Neuindizierung eines Arrays, verbesserte jedoch die Funktion ein wenig, da sie ab PHP Version 5.4 nicht funktioniert, da Variablen als Referenz übergeben werden. Die Beispielfunktion für die Neuindizierung ist dann wie folgt
use
: Verwenden des Schlüsselwortschlusses:quelle
Hier ist meine eigene Implementierung. Die Schlüssel im Eingabearray werden mit inkrementierenden Schlüsseln ab $ start_index neu nummeriert.
quelle
Mach das einfach:
quelle
Sie können dies einfach tun, nachdem Sie die Funktionen array_values () und array_filter () zusammen verwendet haben, um leere Array-Elemente zu entfernen und aus einem Array in PHP neu zu indizieren.
array_filter () -Funktion Die PHP- Funktion array_filter () entfernt leere Array-Elemente oder -Werte aus einem Array in PHP. Dadurch werden auch leere, null, falsche, 0 (Null) Werte entfernt.
array_values () -Funktion Die PHP- Funktion array_values () gibt ein Array zurück, das alle Werte eines Arrays enthält. Das zurückgegebene Array verfügt über Zifferntasten, die bei 0 beginnen und um 1 erhöht werden.
Entfernen Sie leere Array-Elemente und indizieren Sie sie neu
Schauen wir uns zuerst die Ausgabe des $ stack-Arrays an:
Ausgabe:
In der obigen Ausgabe möchten wir leere, null, 0 (null) Werte entfernen und dann Array-Elemente neu indizieren. Jetzt verwenden wir die Funktionen array_values () und array_filter () zusammen wie im folgenden Beispiel:
Ausgabe:
quelle
array_filter()
scheint für die Beispieldaten des OP völlig irrelevant zu sein.Doppelte Entfernung und Neuindizierung eines Arrays:
quelle
array_filter()
scheint für die Beispieldaten des OP völlig irrelevant zu sein.Der schnellste Weg, den ich mir vorstellen kann
Und wenn Sie das Array nur neu indizieren möchten (beginnen Sie bei Null) und PHP +7.3 haben, können Sie dies auf diese Weise tun
Ich glaube, es
array_unshift
ist besser als,array_values
da erstere keine Kopie des Arrays erstellt.quelle
Es fühlt sich so an, als würden alle
array_combine()
Antworten denselben "Fehler" (den unnötigen Aufruf vonarray_values()
) kopieren .array_combine()
ignoriert die Schlüssel beider empfangenen Parameter.Code: ( Demo )
Ausgabe:
quelle
Sortieren ist nur eine Sortierung () , Neuindizierung scheint ein bisschen albern, aber wenn es benötigt wird, wird es dies tun. Obwohl nicht vorhanden. Verwenden Sie array_walk (), wenn Sie dies an mehreren Stellen tun möchten. Verwenden Sie einfach eine for-key-value-Schleife, wenn dies eine einmalige Operation ist.
quelle
Wenn es in Ordnung ist, ein neues Array zu erstellen, ist dies:
Wenn Sie eine Umkehrung an Ort und Stelle benötigen, müssen Sie rückwärts laufen, damit Sie nicht auf die benötigten Indizes stampfen:
quelle
array_values()
darin, ein 0-basiertes Array zu erhalten und dieses Ergebnis dann anzupassen, wenn ein 1-basiertes Array wirklich erforderlich ist.