我遇到了一些奇怪的事情。
我有一个php数组,用数字键索引。然而,似乎不可能访问任何元素,因为php会自动将数字字符串视为整数,从而导致非法偏移通知。
在正常情况下,创建一个带有数字字符串索引的php数组是不可能的,但在类型转换时也可能发生这种情况。
复制:
$object = new stdClass();
$object->{'1'} = 'one';
$array = (array) $object;
var_dump($array);
/* produces
array(1) {
["1"]=>
string(3) "one"
}
*/
//none of the following will work
$key = '1';
echo $array[1], $array['1'], $array["1"], $array[(string)1], $array[$key];
这只是一个边缘情况错误吗?我只是在试图改进另一个SO问题的答案时遇到了这个问题
Live代码示例:http://codepad.viper-7.com/dFSlH1
难以置信,但这是php中的正常行为,它在2008年被认为是一个bug(链接)。
但他们只是指出了(array)
:的演员手册
如果将对象转换为数组,则结果是一个数组元素是对象的属性。键是成员变量名称,但有几个显著的例外:integer属性是不可访问;
您可以使用get_object_vars():
$object = new stdClass();
$object->{'1'} = 'one';
$array = get_object_vars( $object );
$key = '1';
echo $array[1]."<br>";
echo $array['1']."<br>";
echo $array["1"]."<br>";
echo $array[(string)1]."<br>";
echo $array[$key]."<br>";
没有解释为什么会发生这种情况,但这是一个避免演员阵容问题的解决方案。
离题但我觉得这可能很有趣。在手册中找到了这个。
为了避免这类问题,请始终使用整数或字符串作为索引,不要将其混淆,也不要在字符串中使用整数。
混合阵列示例:
$array = array(
1 => "a",
"1" => "b",//overrides 1
1.5 => "c",//overrides "1"
true => "d",//overrides 1.5
);
var_dump($array);
您可以使用
$vars = get_object_vars($object);
echo $vars[1];
在"正常"数组创建中,包含有效整数值的字符串键将自动转换为整数键,但从对象到数组的转换似乎不适用相同的逻辑。
然而,它可以通过使用来修复
$array = array_combine(array_keys($array), array_values($array));
在从对象创建数组的行之后。http://codepad.viper-7.com/v5rGJa
尽管,正如Dave在评论中所说,使用get_object_vars
对我来说也是一种"更清洁"的解决方案。
foreach ($array as $key => $value){
var_dump($key);
var_dump($value);
}
显示
string(1) "1"
string(3) "one"
但echo $array['"1"'];
给出
E_NOTICE : type 8 -- Undefined index: "1" -- at line 8
真奇怪!