2012-05-25 23 views
9

这是......我甚至不知道这是怎么回事。PHP未定义的数组索引。为什么?

// var_dump of items before 
object(stdClass)[84] 
    public '75' => object(stdClass)[87] 

$items = (array) $items; // Casting unserialized stdClass to array 
var_dump($items); 

//Result of var dump: 
array 
    '75' => 
    object(stdClass)[87] 

//Now lets get this item: 
var_dump($items[75]); // Error 
var_dump($items['75']); // Error 

什么?

谢谢。

+1

请显示$ items –

+0

尝试投射到另一个变量'$ new_items =(array)$ items; var_dump($ new_items [75]);' – Aziz

+0

这给了我相同的结果。 –

回答

4

我认为,您正在使用调试扩展,所以var_dump()输出不同于标准库,属性不能是数字,但$obj->{'75'}是好的。 如果可以通过$items->{'75'}达到子对象,那么您的数值属性为yes。 否则,你可以尝试print_r($items);看到原始输出,或之后get_object_vars()

<?php 

$items = new stdClass(); 
$items->{'75'} = new stdClass(); 
$items->{'75'}->{'85'} = new stdClass(); 


$items = (array) $items; // Casting unserialized stdClass to array 
$items_array = get_object_vars($items); // getting object vars as an array. 

var_dump($items["75"]); // Error 
var_dump($items['75']); // Error 
var_dump($items_array['75']); // Works 

PHP问题检查数组:#45959

阅读铸块引用:http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

+0

是的,当$ items仍然是一个对象时,我可以通过$ obj - > {'75'}来到达“75”。 请看:http://pastebin.com/nTbGscD5 –

+1

所以,你必须使用get_object_vars(); –

+0

它的工作,谢谢。这很奇怪,因为在将它们转换为数组并将其运行后,$ items上使用了array_keys。 –

2

转换为数组不像那样工作。

在这里看到:get_object_vars() vs. cast to array

和这里:http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

块引用 “如果一个对象被转换成一个阵列,其结果是一个数组,其元素为对象的属性中的键是。成员变量名称,但有一些值得注意的例外:整型属性不可访问;私有变量具有名称前面的变量名称;受保护的变量在变量名称前加了一个'*',这些前缀的值在两边都有空字节。