Ich habe ein assoziatives Array in der Form, key => value
in der der Schlüssel ein numerischer Wert ist, jedoch kein sequentieller numerischer Wert. Der Schlüssel ist eigentlich eine ID-Nummer und der Wert ist eine Zählung. Dies ist für die meisten Fälle in Ordnung, ich möchte jedoch eine Funktion, die den für Menschen lesbaren Namen des Arrays abruft und diesen für den Schlüssel verwendet, ohne den Wert zu ändern.
Ich habe keine Funktion gesehen, die dies tut, aber ich gehe davon aus, dass ich den alten und den neuen Schlüssel (die ich beide habe) bereitstellen und das Array transformieren muss. Gibt es eine effiziente Möglichkeit, dies zu tun?
php
arrays
associative-array
Thomas Owens
quelle
quelle
Antworten:
quelle
Sie würden dies tun und die Reihenfolge des Arrays beibehalten, indem Sie die Array-Schlüssel in ein separates Array einfügen, den Schlüssel in diesem Array suchen und ersetzen und ihn dann wieder mit den Werten kombinieren.
Hier ist eine Funktion, die genau das tut:
quelle
Wenn Ihr
array
aus einer Datenbankabfrage erstellt wurde, können Sie den Schlüssel direkt aus dermysql
Anweisung heraus ändern :anstatt
benutze so etwas wie:
quelle
Die Antwort von KernelM ist nett, aber um das von Greg im Kommentar angesprochene Problem (widersprüchliche Schlüssel) zu vermeiden, wäre die Verwendung eines neuen Arrays sicherer
quelle
Sie können ein zweites assoziatives Array verwenden, das den IDs von Menschen lesbare Namen zuordnet. Das würde auch eine Viele-zu-1-Beziehung ergeben. Dann machen Sie so etwas:
quelle
Wenn Sie möchten, dass auch die Position des neuen Array-Schlüssels mit der alten übereinstimmt, können Sie Folgendes tun:
quelle
Wenn Ihr Array rekursiv ist, können Sie folgende Funktion verwenden: Testen Sie diese Daten:
Hier ist die Funktion:
quelle
quelle
Ich mag die Lösung von KernelM, aber ich brauchte etwas, das potenzielle Schlüsselkonflikte behandelt (bei denen ein neuer Schlüssel möglicherweise mit einem vorhandenen Schlüssel übereinstimmt). Folgendes habe ich mir ausgedacht:
Sie können dann ein Array wie folgt durchlaufen:
quelle
Hier ist eine Hilfsfunktion, um dies zu erreichen:
ziemlich basierend auf @ KernelM Antwort .
Verwendungszweck:
Bei erfolgreicher Umbenennung wird true zurückgegeben , andernfalls false .
quelle
Einfaches Zeug:
Diese Funktion akzeptiert den Ziel-Hash $ has und $ replace ist auch ein Hash, der newkey => oldkey-Assoziationen enthält .
Diese Funktion behält die ursprüngliche Reihenfolge bei , kann jedoch für sehr große Arrays (wie über 10.000 Datensätze) in Bezug auf Leistung und Speicher problematisch sein .
Diese alternative Funktion würde dasselbe tun, mit weitaus besserer Leistung und Speichernutzung, auf Kosten des Verlusts der ursprünglichen Bestellung (was kein Problem sein sollte, da es sich um eine Hashtabelle handelt!).
quelle
Dieser Code hilft dabei, den alten Schlüssel in einen neuen zu ändern
Anzeige wie
quelle
Einfacher Benchmark-Vergleich beider Lösungen.
Lösung 1 Kopieren und entfernen Sie (Bestellung verloren) https://stackoverflow.com/a/240676/1617857
Lösung 2 Benennen Sie den Schlüssel https://stackoverflow.com/a/21299719/1617857 um
Ergebnisse:
quelle
Sie können diese Funktion basierend auf array_walk verwenden:
Es gibt:
quelle
Dies funktioniert zum Umbenennen des ersten Schlüssels:
dann rendert print_r ($ a) ein repariertes Array in der Reihenfolge:
Dies funktioniert zum Umbenennen eines beliebigen Schlüssels:
print_r ($ a)
eine verallgemeinerte Funktion:
quelle
Wenn Sie mehrere Schlüssel gleichzeitig ersetzen möchten (Reihenfolge beibehalten):
Verwendungszweck:
quelle
Es gibt eine alternative Möglichkeit, den Schlüssel eines Array-Elements zu ändern, wenn Sie mit einem vollständigen Array arbeiten - ohne die Reihenfolge des Arrays zu ändern. Es ist einfach, das Array in ein neues Array zu kopieren.
Ich habe zum Beispiel mit einem gemischten, mehrdimensionalen Array gearbeitet, das indizierte und assoziative Schlüssel enthielt - und ich wollte die ganzzahligen Schlüssel durch ihre Werte ersetzen, ohne die Reihenfolge zu unterbrechen.
Ich habe dazu Schlüssel / Wert für alle numerischen Array-Einträge gewechselt - hier: ['0' => 'foo']. Beachten Sie, dass die Bestellung intakt ist.
Ausgabe:
quelle
Der beste Weg ist die Verwendung von Referenz und nicht die Verwendung von Unset (was einen weiteren Schritt zum Bereinigen des Speichers darstellt).
Lösung:
Sie haben ein Original und eine Referenz mit neuem Namen.
oder wenn Sie nicht möchten, dass zwei Namen in einem Wert enthalten sind, erstellen Sie eine andere Registerkarte und suchen Sie nach einer Referenz
Die Iterration ist bei Schlüsseln besser als das Klonen aller Arrays und das Bereinigen alter Arrays, wenn Sie lange Daten wie 100 Zeilen +++ usw. haben.
quelle
Hmm, ich bin noch kein Test, aber ich denke, dieser Code funktioniert
quelle
Eine, deren Bestellung einfach zu verstehen ist:
quelle
Sie können eine einfache Funktion schreiben, die den Rückruf auf die Schlüssel des angegebenen Arrays anwendet. Ähnlich wie array_map
Hier ist eine Übersicht https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
quelle
Diese Funktion benennt einen Array-Schlüssel unter Beibehaltung seiner Position um, indem er ihn mit der Indexsuche kombiniert.
Verwendungszweck:
quelle
Diese Grundfunktion behandelt das Austauschen von Array-Schlüsseln und das Halten des Arrays in der ursprünglichen Reihenfolge ...
Sie könnten dann alle 'a'-Tasten durchlaufen und zum Beispiel mit' z 'tauschen ...
quelle