Ersetzen Sie Schlüssel in einem Array, das auf einem anderen Lookup-/Mapping-Array basiert

Lesezeit: 5 Minuten

Benutzer-Avatar
Thomas Owens

Ich habe ein assoziatives Array im Formular key => value wobei key ein numerischer Wert ist, jedoch kein fortlaufender numerischer Wert. Der Schlüssel ist eigentlich eine ID-Nummer und der Wert ist eine Zählung. Dies ist für die meisten Instanzen in Ordnung, aber ich möchte eine Funktion, die den für Menschen lesbaren Namen des Arrays erhält 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 Schlüssel und den neuen Schlüssel (beide habe ich) bereitstellen und das Array transformieren muss. Gibt es eine effiziente Möglichkeit, dies zu tun?

  • Siehe ähnlich stackoverflow.com/q/308703

    – Peter Krauß

    29. Juli 2013 um 18:58 Uhr

$arr[$newkey] = $arr[$oldkey];
unset($arr[$oldkey]);

  • Achten Sie nur darauf, dass 1) keine zwei Schlüssel die gleiche menschenlesbare Version haben 2) keine menschenlesbaren Versionen Zahlen sind

    – Greg

    27. Oktober 2008 um 17:38 Uhr

  • Außerdem würde dies vermutlich die Reihenfolge des Arrays ändern, worauf Sie möglicherweise achten müssen. Sogar assoziative Arrays in PHP sind geordnet, und manchmal wird diese Reihenfolge ausgenutzt.

    –Robin Winslow

    9. Februar 2012 um 17:14 Uhr

  • Ja, toller Punkt Robin. Gibt es eine Möglichkeit, die gleiche Reihenfolge beizubehalten? Oder müssen Sie dafür ein neues Array erstellen?

    – Simon Osten

    28. Juni 2012 um 1:19 Uhr

  • Bonusfrage: Wie kann man die ID ändern, aber die Array-Reihenfolge beibehalten?

    – Peter Peller

    11. Dezember 2012 um 22:45 Uhr


  • Wenn sich der Schlüsselwert nicht ändert, löschen Sie ein Array-Element. Vielleicht möchten Sie es überprüfen.

    – Guck

    10. März 2013 um 12:19 Uhr

Benutzer-Avatar
DiverseAndRemote.com

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:

function change_key( $array, $old_key, $new_key ) {

    if( ! array_key_exists( $old_key, $array ) )
        return $array;

    $keys = array_keys( $array );
    $keys[ array_search( $old_key, $keys ) ] = $new_key;

    return array_combine( $keys, $array );
}

  • Danke, das war wirklich hilfreich, da ich die Reihenfolge des Arrays beibehalten musste. Ich hatte die akzeptierte Antwort bereits versucht, bevor ich diese Seite gefunden hatte.

    – Gillytech

    2. Februar 2016 um 7:46 Uhr

  • Ja viel lieber die Reihenfolge des Arrays beibehalten, sieht ordentlicher aus.

    – Phil Koch

    24. März 2016 um 12:01 Uhr

  • Musste die Schlüsselreihenfolge beibehalten, gut, hat wie ein Zauber funktioniert!

    – Abhay Maurya

    18. Dezember 2018 um 12:02 Uhr

  • Beachten Sie, ob Sie Aufführungen oder die Beibehaltung der Bestellung wünschen: stackoverflow.com/a/58619985/1617857

    – Leo Benoist

    30. Oktober 2019 um 6:55 Uhr

  • Dies ist eine sehr schlechte Implementierung, was die Leistung betrifft. Es ist besser, Ordnung separat aufzubewahren oder zu verwenden array_splice wie in diesem Beispiel: stackoverflow.com/questions/3797239/…

    – Milos Radojewic

    19. August 2021 um 8:27 Uhr

Benutzer-Avatar
Simon Frank

wenn dein array aus einer Datenbankabfrage aufgebaut ist, können Sie den Schlüssel direkt aus der ändern mysql Aussage:

Anstatt von

"select ´id´ from ´tablename´..."

Verwenden Sie so etwas wie:

"select ´id´ **as NEWNAME** from ´tablename´..."

  • Anstatt diese Aufgabe zu umgehen und anzunehmen, dass die Eingabedaten aus einer Ergebnismenge stammen, hätten Sie vielleicht diese Klärung suchen sollen, bevor Sie eine Antwort posten.

    – mickmackusa

    26. Februar um 7:54 Uhr

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

$newarr[$newkey] = $oldarr[$oldkey];
$oldarr=$newarr;
unset($newarr);

$array = [
    'old1' => 1
    'old2' => 2
];

$renameMap = [
    'old1' => 'new1',   
    'old2' => 'new2'
];

$array = array_combine(array_map(function($el) use ($renameMap) {
    return $renameMap[$el];
}, array_keys($array)), array_values($array));

/*
$array = [
    'new1' => 1
    'new2' => 2
];
*/

  • Ich liebe mich meine Array-Funktionen. Ich wollte dies gerade als netten Einzeiler vorschlagen, um alle Schlüssel umzubenennen und die Array-Reihenfolge beizubehalten, aber ich werde stattdessen Ihres empfehlen.

    – Herbst Leonard

    17. April 2018 um 17:32 Uhr

  • Schön und eng. Wenn Sie an einem großen Array arbeiten und nicht alle Schlüssel ändern möchten, wird die Zeile in der Map-Funktion zu return isset($renameMap[$el]) ? $renameMap[$el] : $el;

    – Jerry

    1. April 2021 um 23:12 Uhr


  • Dieser Antwort fehlt ihre pädagogische Erklärung.

    – mickmackusa

    26. Februar um 7:57 Uhr

  • Das hat diejenigen, die positiv abgestimmt haben, nicht gestört.

    – temuri

    26. Februar um 13:55 Uhr

Benutzer-Avatar
Thomas Ritter

Sie könnten ein zweites assoziatives Array verwenden, das menschenlesbare Namen den IDs zuordnet. Das würde auch eine Viele-zu-1-Beziehung liefern. Dann mach sowas:

echo 'Widgets: ' . $data[$humanreadbleMapping['Widgets']];

  • Ich liebe mich meine Array-Funktionen. Ich wollte dies gerade als netten Einzeiler vorschlagen, um alle Schlüssel umzubenennen und die Array-Reihenfolge beizubehalten, aber ich werde stattdessen Ihres empfehlen.

    – Herbst Leonard

    17. April 2018 um 17:32 Uhr

  • Schön und eng. Wenn Sie an einem großen Array arbeiten und nicht alle Schlüssel ändern möchten, wird die Zeile in der Map-Funktion zu return isset($renameMap[$el]) ? $renameMap[$el] : $el;

    – Jerry

    1. April 2021 um 23:12 Uhr


  • Dieser Antwort fehlt ihre pädagogische Erklärung.

    – mickmackusa

    26. Februar um 7:57 Uhr

  • Das hat diejenigen, die positiv abgestimmt haben, nicht gestört.

    – temuri

    26. Februar um 13:55 Uhr

Benutzer-Avatar
Spreadzz

Wenn Sie möchten, dass auch die Position des neuen Array-Schlüssels dieselbe wie die des alten ist, können Sie dies tun:

function change_array_key( $array, $old_key, $new_key) {
    if(!is_array($array)){ print 'You must enter a array as a haystack!'; exit; }
    if(!array_key_exists($old_key, $array)){
        return $array;
    }

    $key_pos = array_search($old_key, array_keys($array));
    $arr_before = array_slice($array, 0, $key_pos);
    $arr_after = array_slice($array, $key_pos + 1);
    $arr_renamed = array($new_key => $array[$old_key]);

    return $arr_before + $arr_renamed + $arr_after;
}

1362550cookie-checkErsetzen Sie Schlüssel in einem Array, das auf einem anderen Lookup-/Mapping-Array basiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy