Получение первого объекта из файла JSON

Как мне получить доступ к «thumburl», если я не знаю «pageid»?

{
"continue": {
"iistart": "2004-12-19T12:37:26Z",
"continue": "||"},
"query": {
"pages": {
"30260": {
"pageid": 30260,
"ns": 6,
"title": "File:Japanese diet inside.jpg",
"imagerepository": "local",
"imageinfo": [
{
"thumburl": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Japanese_diet_inside.jpg/130px-Japanese_diet_inside.jpg",
"thumbwidth": 130,
"thumbheight": 95,
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Japanese_diet_inside.jpg",
"descriptionurl": "https://commons.wikimedia.org/wiki/File:Japanese_diet_inside.jpg",
"descriptionshorturl": "https://commons.wikimedia.org/w/index.php?curid=30260"}
]
}
}
}
}

С несколькими объектами в PHP я могу сделать это imageinfo[0] но если я поставлю $imageurl = $data->query->pages[0]->imageinfo[0]->thumburl; Это не работает, потому что это объект, а не массив.

Как я могу это сделать?

2

Решение

Ты можешь позвонить get_object_vars чтобы получить ассоциативный массив свойств объекта, а затем получить первое из них.

$props = array_values(get_object_vars($data->query->pages));
$imageurl = $props[0]->imageinfo[0]->thumburl;
3

Другие решения

Вы могли бы использовать reset() чтобы получить первый элемент:

$data = json_decode($json) ;
$elem = reset($data->query->pages) ;
$imageurl = $elem->imageinfo[0]->thumburl ;
3

Вы можете пройти через него, так что вам не нужен ключ массива, например так:

$pages = (array) $data->query->pages;
foreach($pages as $page) {
$imageinfo = $page->imageinfo[0]->thumburl;
}

Но это даст вам только последний из списка страниц. Так что, если вы знаете, что есть больше страниц, вам нужно хранить эти thumburl в массиве. Или, если вы уверены, что хотите только сначала, просто exit после первого цикла

1

Другая альтернатива — декодировать как массив и переиндексировать, чтобы он всегда начинался с 0:

$result = array_values(json_decode($json, true)['query']['pages'])[0];

Тогда вы можете получить доступ $result['imageinfo']['thumburl'] или добавить его к вышесказанному.

1
По вопросам рекламы [email protected]