我遇到了一些奇怪的事情。
我有一个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];
这只是一个边缘案例错误吗?我在尝试改进another SO question
的答案时才遇到问题答案 0 :(得分:13)
令人难以置信,但这是PHP中的正常行为,在2008年被视为一个错误(link)。
但是他们只是用$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>";
如果将对象转换为数组,则结果是一个数组 元素是对象的属性。键是成员变量 名称,但有一些值得注意的例外:整数属性 的不可访问强>
您可以改为使用get_object_vars():
$array = array(
1 => "a",
"1" => "b",//overrides 1
1.5 => "c",//overrides "1"
true => "d",//overrides 1.5
);
var_dump($array);
不解释为什么会发生这种情况,但这是避免演员问题的解决方案。
关闭主题,但我想也许这很有意思。在manual中找到了这个。
为了避免这些问题,请始终使用整数或字符串作为索引,不要混淆它,也不要在字符串中使用整数。
混合数组示例:
<VirtualHost *:80> ServerName 104.236.27.195 ServerAlias mugendoassociationofireland.ie
DocumentRoot "/var/www/html/public"
<Directory "/var/www/html/public/">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
答案 1 :(得分:5)
您可以使用
$vars = get_object_vars($object);
echo $vars[1];
答案 2 :(得分:2)
包含有效整数值的字符串键将在“普通”数组创建中自动转换为整数键 - 但似乎从对象到数组的转换不会应用相同的逻辑。
然而,可以使用
修复它$array = array_combine(array_keys($array), array_values($array));
在从对象创建数组的行之后。 http://codepad.viper-7.com/v5rGJa
虽然和Dave在评论中已经说过的一样,但使用get_object_vars
对我来说也是一个“更清洁”的解决方案。
答案 3 :(得分:1)
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
那很奇怪!