2010-12-07 6 views
5

In PHP 5.3 wurde die Art und Weise geändert, wie Arrays bearbeitet werden.php 5.3 Array-Kompatibilität

Beispiel Array:

<?php $a = array ('foo' => 1, 'bar' => 2, 'foo' => 3); ?> 

Gebrauch über write 'foo' mit dem letzten in der Reihe zu ergeben:

array(
    'foo' => 3, 
    'bar' => 2 
) 

jetzt in 5.3 kehrt

array(
    'foo' => 1, 
    'bar' => 2 
) 

Ich teste auf einem php v5.2.11, also kann ich dieses mein Selbst nicht dieses Beispiel von der php.net Web site prüfen: http://php.net/manual/en/language.types.array.php und die Seite für 5,3

würde die Methode der Werte über

<?php 
    $a['foo'] = 1; 
    $a['bar'] = 2; 
    $a['foo'] = 3; 
?> 

bietet eine rückwärtskompatibel Patch für dieses Problem suchen Einstellung? gibt es noch andere Dinge zu beachten, wenn Sie mit Arrays in der neuen Version von PHP umgehen?

+1

Dies würde als undefiniertes Verhalten klassifizieren. Aber btw, 5.3 überschreibt immer noch mit dem letzten Wert. – mario

+0

"Dieses Beispiel stammt von der php.net-Website" - können Sie darauf verlinken? – salathe

Antwort

0

Ich denke, Sie sollten eindeutige Schlüssel für das Array verwenden.

<?php $a = array ('foo' => 1, 'bar' => 2); ?> 

Dann aktualisieren Sie den Wert von foo.

<?php $a['foo'] = 3; ?> 
+0

Es ist nicht der Punkt, es gibt einen Fehler wie in anderen Fällen bestätigt, dies ist keine dokumentierte Änderung. – RobertPitt

2

Aus dem Handbuch:

Beachten Sie, dass, wenn zwei identische Index definiert sind, die letzte die erste überschrieben.

Also, wenn Sie nicht irgendwie einen PHP-Fehler (unwahrscheinlich) ausgelöst haben, dann gibt es etwas anderes, das Sie vermissen.

Und um Ihre Frage zu beantworten, ja, Überschreiben von Schlüsseln über den Zuweisungsoperator funktioniert. Bevor Sie anfangen, den Code zu ändern, würde ich jedoch überprüfen, ob das Problem das ist, was Sie derzeit denken, da das Handbuch direkt behauptet, dass die letzteren Schlüssel die früheren überschreiben werden.

Update: @ sberry2A Link zeigt einen Ort, an dem PHP 5.3 ist fehlerhaft (d. H., Tut nicht, was das Handbuch sagt).

class Foo 
{ 
    const A = 1; 
    const B = 1; 

    public static $bar = array(self::A => 1, self::B => 2); 
} 

Man würde erwarten, dass der Wert von Foo::$bar[1] ist 2, aber es ist immer noch 1. Doch richtig folgende Arbeiten:

class Foo 
{ 
    const A = 1; 
    const B = 1; 

    public static function bar() 
    { 
    return array(self::A => 1, self::B => 2); 
    } 
} 

So ist es nur, dass spezifischer Fall statischer Eigenschaft Arrays von verschiedenen Konstanten indiziert, die den gleichen Wert haben. Das ist die einzige Möglichkeit in PHP 5.3.3, dass ich das Verhalten auslösen kann, aber vielleicht gibt es auch andere Möglichkeiten ... offensichtlich kann man sich nicht auf ein bestimmtes Verhalten verlassen.