массив php или не массив? - PullRequest
       33

массив php или не массив?

0 голосов
/ 02 октября 2009

Я не понимаю ... Я что-то делаю, и когда я делаю print_r ($ var); он говорит мне, что у меня есть массив, поэтому, естественно, я думаю, что у меня есть массив еще, когда я делаю

if(is_array($xml->searchResult->item))

возвращает false

Я использую этот массив с foreach (); в документации говорится, что foreach () не будет работать ни с чем, кроме массива, поэтому при условии, что это массив, с которым я работаю

плюс, если я попытаюсь получить к нему доступ через
echo $xml->searchResult->item[3];
я получу 4-й элемент моего массива

Ответы [ 6 ]

6 голосов
/ 02 октября 2009

print_r также будет печатать объекты, как если бы они были массивами.

3 голосов
/ 02 октября 2009

хорошо, is_array () возвращает true, если ваша переменная является массивом, в противном случае возвращает false В вашем случае $ xml-> searchResult-> item не является массивом. Какой вывод для

var_dump($xml->searchResult->item)

? Еще один совет: вы можете определить тип переменной с помощью gettype ().

1 голос
/ 02 октября 2009

плюс, если я попытаюсь получить к нему доступ через echo $ xml-> searchResult-> item [3]; я получу 4-й элемент моего массива

Правильно, первый элемент всегда равен 0, если вы его не измените.

1 голос
/ 02 октября 2009

is_array () возвращает true только для реальных массивов php. Можно создать «поддельный» массив с помощью класса ArrayAccess. То есть вы можете использовать обычную семантику массива (например, item [3]), но это не настоящий массив. Я подозреваю, что ваш $ item является объектом. Так что используйте

 if($x instanceof ArrayAccess || is_array($x))

Вместо.

0 голосов
/ 31 марта 2011

Просто будьте внимательны, чтобы проверить, что было возвращено вашим массивом. У вас может быть объект с классом или stdClass, который пуст и вы не можете получить элемент из него.

0 голосов
/ 02 октября 2009

В руководстве упоминается, что foreach также работает с объектами и будет перебирать свойства.

В вашем случае ситуация немного отличается, потому что, я полагаю, вы используете SimpleXML, что является еще одним особым случаем. SimpleXMLElement имеет свой собственный итератор, который, как я полагаю, жестко запрограммирован, поскольку, похоже, он не реализует ни один из интерфейсов SPL .

Короче говоря, некоторые объекты могут использоваться как массив, но они не один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...