在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中处理数组时还有其他注意事项吗?
答案 0 :(得分:3)
这似乎确定了同样的,有点奇怪的行为。
答案 1 :(得分: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中我可以触发行为的唯一方法,但也许还有其他方法......显然不能依赖某种行为。
答案 2 :(得分:0)
我认为您应该为阵列使用唯一键。
<?php $a = array ('foo' => 1, 'bar' => 2); ?>
然后更新foo的值。
<?php $a['foo'] = 3; ?>