2009-11-04 2 views
8

Я преобразовал массив объекта данных, как это:PHP со ссылкой на объект данных с числовым ключом

<?php 
$myobject->data = (object)Array('zero','one','two'); 
print_r($myobject); 
?> 

И выход:

stdClass Object ([data] => stdClass Object ([0] => zero [1] => one [2] => two))

До сих пор так хорошо. Но если я попытаюсь обратиться к цифровым клавишам ...

<?php 
$myobject->data = (object)Array('zero','one','two'); 
$counter = 1; 
echo $myobject->data->$counter; 
?> 

... ничего не возвращается! Я ожидал, что он будет эхом «один».

Я делаю это неправильно?

ответ

15

Это странность в PHP, вам нужно получить к ней доступ, используя $object->data->{1}. Или вы можете преобразовать его обратно в массив для доступа к членам. Но я считаю, что лучше иметь собственные имена для членов объекта, попробовать что-то вроде этого, например:

$myobject->data = (object)Array('m0' => 'zero','m1' => 'one','m2' => 'two'); 
$myObject->data->m1; 
1

Вы можете попробовать получить доступ к нему как к элементу массива. Но я не уверен, что это сработает или нет. Однако, что вы можете сделать, это цикл над элементами объекта (а точнее, свойствами) с использованием цикла foreach.

Как так:

foreach ($myobject->data as $key => $value) 
    echo "$key is my key.<br />"; 

Я просто не уверен, можно ли получить доступ к ключу тоже.

+0

Вы проверили это? Мне было бы интересно узнать, работает ли это. Иначе просто используйте решение soulmerge. – Franz

-3
echo $myobject->data[$counter]; 

Если я не ошибаюсь.

+0

Неустранимая ошибка: нельзя использовать объект типа stdClass как массив –

+2

Пока класс не реализует ArrayAccess, вы не можете получить к нему доступ таким образом: http://de2.php.net/manual/de/class.arrayaccess .php – Boldewyn

1

Проблемы у вас есть, что $counter автоматически преобразуется в строку для просмотровых. Попробуйте

$myobject->$counter = "abc"; 
var_dump($myobject); 

и вы увидите, что я имею в виду. Чтобы обойти это использование, предложил метод Франца.

Смежные вопросы