2010-12-07 2 views
5

В php 5.3 изменились способы обработки массивов.php 5.3 Совместимость массива

Пример массива:

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

использовать, чтобы над записью 'Foo' с последним в массиве, чтобы дать:

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

сейчас в 5.3 он возвращает

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

Я тестирую php v5.2.11, поэтому я не могу проверить это сам, этот пример с сайта php.net: http://php.net/manual/en/language.types.array.php и поиск страницы для 5.3

бы метод установки значений с помощью

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

обеспечивает обратный совместимый патч для этой проблемы? Есть ли какие-либо другие вещи, которые следует учитывать при работе с массивами в новой версии php?

+1

Это бы классифицировать, как неопределенное поведение. Но кстати, 5.3 все еще перезаписывает последнее значение. – mario 2010-12-07 00:54:33

+0

«этот пример с сайта php.net» - можете ли вы ссылаться на него? – salathe 2010-12-07 07:50:37

ответ

0

Я думаю, вы должны использовать уникальные ключи для массива.

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

Затем обновите значение foo.

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

Не в этом дело, есть ошибка, подтвержденная в других случаях, это не документированное изменение. – RobertPitt 2010-12-07 09:34:17

2

Из инструкции:

Обратите внимание, что, когда два одинаковых индекса определяются, последний перезаписать первый.

Итак, если вы каким-то образом не вызвали ошибку PHP (маловероятно), то происходит что-то еще, что вам не хватает.

И, чтобы ответить на ваш вопрос, да, перезапись ключей с помощью оператора присваивания работает. Однако перед тем, как вы начнете изменять код, я бы проверял, чтобы проблема была в том, что вы сейчас думаете, потому что в руководстве действительно утверждается, что последние ключи будут перезаписывать прежние.

Обновление: @ Ссылка sberry2A показывает место, где PHP 5.3 является ошибкой (то есть не делает то, что говорится в руководстве).

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

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

Можно было бы ожидать, что значение Foo::$bar[1] является 2, но она по-прежнему 1. Однако следующие работы должным образом:

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

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

Так что это только то, что конкретный случай статических массивов свойств проиндексированных различных констант, которые имеют одинаковое значение. Это единственный способ в PHP 5.3.3, что я могу вызвать поведение, но, возможно, есть и другие способы ... очевидно, на определенное поведение нельзя полагаться.