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


Access array element indexed by numerical string

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

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

真奇怪!