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

6voto

kenorb Punkte 134883

Hier ist eine Hilfsfunktion, um dies zu erreichen:

/**
 * Helper function to rename array keys.
 */
function _rename_arr_key($oldkey, $newkey, array &$arr) {
    if (array_key_exists($oldkey, $arr)) {
        $arr[$newkey] = $arr[$oldkey];
        unset($arr[$oldkey]);
        return TRUE;
    } else {
        return FALSE;
    }
}

basiert ziemlich auf @KernelM Antwort .

Verwendung:

_rename_arr_key('oldkey', 'newkey', $my_array);

Es wird zurückgegeben verdadero bei erfolgreicher Umbenennung, sonst falsch .

1 Stimmen

Beachten Sie, dass sich dadurch die Reihenfolge des Arrays ändert (das Element des umbenannten Schlüssels befindet sich am Ende des Arrays, nicht an der gleichen Position im Array wie ursprünglich). Außerdem würde ich einen Funktionsnamen normalerweise nicht mit einem Unterstrich beginnen (dieser wird traditionell verwendet, um spezielle Funktionen für den internen Gebrauch zu kennzeichnen).

4voto

Dieser Code hilft, den alten Schlüssel in einen neuen umzuwandeln

$i = 0;
$keys_array=array("0"=>"one","1"=>"two");

$keys = array_keys($keys_array);

for($i=0;$i<count($keys);$i++) {
    $keys_array[$keys_array[$i]]=$keys_array[$i];
    unset($keys_array[$i]);
}
print_r($keys_array);

anzeigen wie

$keys_array=array("one"=>"one","two"=>"two");

0 Stimmen

...aber der Fragesteller ist nicht auf der Suche nach einer Möglichkeit, Werte als neue Schlüssel anzuwenden. Wenn das die Aufgabe wäre, dann bietet PHP bereits von Haus aus array_combine($keys_array, $keys_array) . Ich will damit sagen, dass niemand auf die Idee kommen sollte, Ihr Snippet zu verwenden - selbst wenn es den gewünschten Effekt hätte.

4voto

Nadir Punkte 665

Einfaches Zeug:

diese Funktion akzeptiert das Ziel $hash und $replacements ist ebenfalls ein Hash mit Assoziationen neuer Schlüssel=>alter Schlüssel .

Diese Funktion wird Erhaltung der ursprünglichen Ordnung aber bei sehr großen Arrays (z. B. über 10k Datensätze) könnte dies problematisch sein. Leistung und Speicher .

function keyRename(array $hash, array $replacements) {
    $new=array();
    foreach($hash as $k=>$v)
    {
        if($ok=array_search($k,$replacements))
            $k=$ok;
        $new[$k]=$v;
    }
    return $new;    
}

würde diese alternative Funktion dasselbe tun, mit weitaus bessere Leistung & Speicherverbrauch, auf Kosten des Verlusts der ursprünglichen Reihenfolge (was kein Problem sein sollte, da sie hashtable ist!)

function keyRename(array $hash, array $replacements) {

    foreach($hash as $k=>$v)
        if($ok=array_search($k,$replacements))
        {
          $hash[$ok]=$v;
          unset($hash[$k]);
        }

    return $hash;       
}

0 Stimmen

Keine explizite Prüfung auf false bei Verwendung von array_search() ist problematisch. Was ist, wenn der gesuchte Schlüssel das erste Element ist? Ich fürchte, Sie lehren mit dieser Antwort unzuverlässige Praktiken. Außerdem, loosing wird buchstabiert losing .

0 Stimmen

Wenn man außerdem davon ausgeht, dass der Fragesteller alle Schlüssel in ihrem ursprünglichen Array übersetzen muss, dann raten Sie zu Schleifenaufrufen einer benutzerdefinierten Funktion, die Schleifenaufrufe ohne eine frühe return / break . Das wird definitiv nicht gut laufen.

0 Stimmen

(festes Verlieren) - sicher, wenn(($ok=array_search($k,$replacements)!==false) wird sicherer sein

3voto

mickmackusa Punkte 36793

Diese Seite wurde mit einer breiten Interpretation der Anforderungen gespickt, da es kein minimales, überprüfbares Beispiel im Fragenteil gibt. Einige Antworten versuchen lediglich, den "Titel" zu lösen, ohne sich die Mühe zu machen, die Anforderungen der Frage zu verstehen.

Der Schlüssel ist eine ID-Nummer und der Wert ist eine Anzahl. Dies ist für die meisten Fälle in Ordnung, aber ich möchte eine Funktion, die den lesbaren Namen des Arrays abruft und diesen als Schlüssel verwendet, ohne den Wert zu ändern.

PHP-Schlüssel können nicht geändert aber sie können ersetzt werden - deshalb raten so viele Antworten zur Verwendung von array_search() (ein relativ schlechtes Ergebnis) und unset() .

Letztendlich möchten Sie ein neues Array mit Namen als Schlüssel erstellen, die sich auf die ursprüngliche Anzahl beziehen. Dies ist am effizientesten über ein Lookup-Array möglich, da die Suche nach Schlüsseln immer besser ist als die Suche nach Werten.

Code: ( Demo )

$idCounts = [
    3 => 15,
    7 => 12,
    8 => 10,
    9 => 4
];

$idNames = [
    1 => 'Steve',
    2 => 'Georgia',
    3 => 'Elon',
    4 => 'Fiona',
    5 => 'Tim',
    6 => 'Petra',
    7 => 'Quentin',
    8 => 'Raymond',
    9 => 'Barb'
];

$result = [];
foreach ($idCounts as $id => $count) {
    if (isset($idNames[$id])) {
        $result[$idNames[$id]] = $count;
    }
}
var_export($result);

Salida:

array (
  'Elon' => 15,
  'Quentin' => 12,
  'Raymond' => 10,
  'Barb' => 4,
)

Diese Technik behält die ursprüngliche Array-Reihenfolge bei (für den Fall, dass die Sortierung von Bedeutung ist), führt keine unnötigen Iterationen durch und ist sehr schnell aufgrund der isset() .

2voto

Alekzander Punkte 746

Sie können diese Funktion auf der Grundlage von array_walk verwenden:

function mapToIDs($array, $id_field_name = 'id')
{
    $result = [];
    array_walk($array, 
        function(&$value, $key) use (&$result, $id_field_name)
        {
            $result[$value[$id_field_name]] = $value;
        }
    );
    return $result;
}

$arr = [0 => ['id' => 'one', 'fruit' => 'apple'], 1 => ['id' => 'two', 'fruit' => 'banana']];
print_r($arr);
print_r(mapToIDs($arr));

Es gibt:

Array(
    [0] => Array(
        [id] => one
        [fruit] => apple
    )
    [1] => Array(
        [id] => two
        [fruit] => banana
    )
)

Array(
    [one] => Array(
        [id] => one
        [fruit] => apple
    )
    [two] => Array(
        [id] => two
        [fruit] => banana
    )
)

0 Stimmen

Diese Antwort (die das vom Fragesteller beschriebene Szenario völlig ignoriert) ist ein Over-Engineering einer Lösung, für die PHP bereits einen nativen Funktionsaufruf bietet. Ich würde Ihr Skript niemals in einem meiner Codes verwenden. Ich würde das hier verwenden: array_column($arr, null, 'id') . Aber auch hier muss ich sagen, dass Ihre Antwort nichts mit der hier gestellten Frage zu tun hat, die nur flache Arrays verarbeitet.

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