412 Stimmen

Wie kann man in PHP den Schlüssel eines Array-Elements ändern?

Ich habe ein assoziatives Array in der Form key => value wobei der Schlüssel 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 in den meisten Fällen in Ordnung, aber ich möchte 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 Schlüssel und den neuen Schlüssel (die ich beide habe) bereitstellen und das Array umwandeln muss. Gibt es eine effiziente Möglichkeit, dies zu tun?

0 Stimmen

658voto

KernelM Punkte 8596
$arr[$newkey] = $arr[$oldkey];
unset($arr[$oldkey]);

7 Stimmen

Achten Sie nur darauf, dass 1) keine zwei Schlüssel die gleiche für den Menschen lesbare Version haben 2) keine für den Menschen lesbaren Versionen zufällig Zahlen sind

94 Stimmen

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

8 Stimmen

Ja, guter Punkt, Robin. Gibt es eine Möglichkeit, die gleiche Reihenfolge beizubehalten? Oder muss man dafür ein neues Array erstellen?

117voto

DiverseAndRemote.com Punkte 18196

Die Art und Weise, wie Sie dies tun und die Reihenfolge des Arrays beibehalten würden, besteht darin, die Array-Schlüssel in ein separates Array zu legen, den Schlüssel in diesem Array zu suchen und zu ersetzen und ihn dann wieder mit den Werten zu 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 );
}

3 Stimmen

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

4 Stimmen

Ja, ich bevorzuge es, die Reihenfolge des Arrays beizubehalten, das sieht ordentlicher aus.

0 Stimmen

Achten Sie darauf, ob Sie Leistungen oder Auftragserhaltung wünschen: stackoverflow.com/a/58619985/1617857

60voto

Simon Franco Punkte 615

Wenn Ihr array aus einer Datenbankabfrage erstellt wird, können Sie den Schlüssel direkt in der mysql Erklärung:

anstelle von

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

verwenden Sie etwas wie:

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

1 Stimmen

Anstatt dieser Aufgabe auszuweichen und davon auszugehen, dass die Eingabedaten aus einer Ergebnismenge stammen, hätten Sie sich vielleicht um diese Klärung bemühen sollen, bevor Sie eine Antwort schreiben.

1 Stimmen

@Conrado Ich verstehe, dass diese Antwort Ihrem individuellen Bedürfnis entspricht, aber es ist nicht gut für eine aufgeblähte Stack Overflow-Seite, wenn sie mit Hypothesen erweitert wird, da dies die Erfahrung des Forschers verlangsamt. Bitte lesen Sie meine Antwort, um zu verstehen, warum viele Antworten auf dieser Seite an den eigentlichen Anforderungen der Frage "vorbeigehen".

21voto

kjg Punkte 258

Die Antwort von KernelM ist gut, aber um das von Greg im Kommentar angesprochene Problem (widersprüchliche Schlüssel) zu vermeiden, wäre es sicherer, ein neues Array zu verwenden

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

0 Stimmen

Dies ist eine gute Lösung, solange Ihr Array eine angemessene Größe hat. Wenn Ihr Array mehr als die Hälfte des verfügbaren PHP-Speichers beansprucht, wird dies nicht funktionieren.

13 Stimmen

@kingjeffrey, nicht wirklich. Array-Werte werden nicht dupliziert, solange sie "nur kopiert" werden, ohne verändert zu werden. Wenn es z.B. ein Array gibt, das 10'000 Elemente enthält und 40MB Speicher verbraucht, wird beim Kopieren Speicher verbraucht, der nur für die Speicherung von 10'000 Elementen benötigt wird Verweise auf bereits vorhandene Werte statt Kopien von Werten Wenn also 1 Array 40 MB verbraucht, kann seine Kopie vielleicht 0,5 MB verbrauchen (getestet).

19voto

temuri Punkte 2625
$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
];
*/

2 Stimmen

Gut und fest. Wenn Sie mit einem großen Array arbeiten und nicht alle Schlüssel ändern wollen, wird die Zeile in der map-Funktion return isset($renameMap[$el]) ? $renameMap[$el] : $el;

1 Stimmen

In dieser Antwort fehlt die pädagogische Erklärung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X