2016-04-27 13 views
-2

Angenommen, ich habe dieses assoziatives Array:PHP in-Place einen einzelnen Schlüssel in einem assoziativen Array ändern?

$fruits = array(
'red' => 'strawberry', 
'blue' => 'banana', 
'green' => 'apple', 
); 

ich den Schlüssel blue in yellow ändern möchten. Beachten Sie, dass ich einen Schlüssel ändern möchte, keinen Wert. Ich kann dies tun:

$fruits['yellow'] = $fruits['blue']; 
unset($fruits['blue']); 

Aber dies führt zu 'yellow' => 'banana' am Ende sein des Arrays. Wenn ich die Reihenfolge des Arrays beibehalten müsste, also 'yellow' => 'banana' ist an der gleichen Position wie zuvor 'blue' => 'banana', wie mache ich das?

Natürlich kann ich das gesamte Array rekonstruieren, alle Schlüssel/Wert-Paare hinzufügen und nur die yellow statt blue Schlüssel einfügen, aber das scheint eine ziemlich träge Art, dies zu tun.

Gibt es einen intelligenteren/effizienteren (vorzugsweise PHP-nativen) Ansatz, um dies an Ort und Stelle zu tun?

+3

Eigentlich, was Sie haben, ist die richtige. Hier ist keine Bestellung. Das macht keinen Unterschied. Warum benötigen Sie eine spezielle Bestellung? Dann können Sie numerische Indizes verwenden, oder? –

+0

Sie müssen zuerst verstehen, wie Arrays in PHP arbeiten .... http: //php.net/manual/en/language.types.array.php –

+0

@PraveenKumar Wenn ich mich nicht irre, PHP Arrays sind bestellt? (auch nach @GeorgePants Link?) Wenn ich 'implode ('', $ fruits) mache, bekomme ich immer das gleiche Ergebnis, d. h." Erdbeer Bananen Apfel "' in dieser Reihenfolge. – RocketNuts

Antwort

0

Das folgende Beispiel aus array_splice() for associative arrays

$newArray = array_slice($fruits, 0, $offset, true) + 
      array('yellow' => 'banana') + 
      array_slice($fruits, $offset, NULL, true); 

         print_r($newArray); 

weitgehend genommen ist, wenn wir den Offset, wo der Schlüssel „blau“ ist wissen, können wir einen neuen Schlüssel von Gelb in seinem Platz.

In Ihrem Fall ist der Offset also 1, weil Blau der zweite Schlüssel im Array ist.

+0

Dies beantwortet diese Frage nicht. Sagen Sie in Ihrer Antwort, wie relevant das für diese Frage ist? –

0

Eine Lösung wäre, die Schlüssel mit array_keys zu bekommen, tragen Sie eine Funktion, sie zu ändern, wie Sie wollen, und dann die neuen Schlüssel mit den Werten kombinieren array_combine mit

$array = array_combine(array_map('replace_key', array_keys($fruits)), $fruits); 

    function replace_key($key){ 
    if($key=="blue") return "yellow"; 
    return $key; 
    } 

Eine andere Lösung wäre array_walk zu verwenden

$result = array(); 
    array_walk($fruits, function (&$value,$key) use (&$result) { 
     if($key=="blue") $key="yellow"; 
     $result[ $key ] = $value; 
     }); 
print_r($result); 

ein anderer Weg, es zu tun (und wahrscheinlich schneller) ist durch eine foreach-Schleife und die array.And neu erstellen, wenn Sie eine generische Lösung wollen nur eine einfache Funktion schreiben, auf diesem Code basiert:

$temp_array=array(); 

foreach($fruits as $key=>$value){ 

if($key=="blue") $key="yellow"; 

$temp_array[$key]=$value; 
} 

$fruits=$temp_array; 
0

Der schnellste Weg:

foreach($fruits as $key=>$value){ 
    If ($key==="blue"){ 
     $fruits["yellow"]= $value; 
     unset($fruits[$key]); 
    } 
} 
+0

Wie ist das schneller als (oder sogar so schnell wie) was ich in meiner Frage gepostet habe? (Ich meine '$ fruits ['yellow'] = $ fruits ['blue']; unset ($ fruits ['blue']);') – RocketNuts