访问由数字字符串索引的数组元素

时间:2015-11-13 15:25:30

标签: php

我遇到了一些奇怪的事情。

我有一个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

的答案时才遇到问题

实时代码示例:http://codepad.viper-7.com/dFSlH1

4 个答案:

答案 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>";

指出演员manual
  

如果将对象转换为数组,则结果是一个数组   元素是对象的属性。键是成员变量   名称,但有一些值得注意的例外:整数属性   的不可访问

您可以改为使用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

那很奇怪!