В настоящее время у меня есть этот большой файл JSON: hastebin
Но просто хочу названия постов.
Я попробовал это …
$json = $page;
$o = json_decode($json, true);
echo($json);
$titles = $o["*"]["*"]["*"]["*"]["title"];
var_dump($titles);
Но это не работает — это возвращает NULL! Иногда это просто ничего не возвращает.
Если кому-то интересно, да, это от Reddit.
Это должно сделать это:
$titles = array_map(function($post) {
return $post['data']['title'];
}, $o['data']['children']);
Я не уверен, что вы ожидали, используя "x"
индексы, но вы, вероятно, должны прочитать о массивы.
PHP не может использовать подстановочные знаки, такие как *
в массиве ключей. Какую бы строку вы ни использовали для ссылки на ключ, она попытается найти ключ с этой точной строкой. То, что вы пытались, не может работать, потому что нет *
ключи.
Вы можете получить его путем итерации всех уровней или внешнего уровня и обращения к соответствующему вложенному ключу. Но если вы просто ищете все экземпляры ‘title’, рекурсивный метод может быть более простым способом получить их.
array_walk_recursive($o, function($value, $key) use (&$titles) {
if ($key == 'title') $result[] = $value;
});
var_dump($titles);
Это получит любое значение ‘title’ независимо от его глубины в массиве, поэтому, если это не то, что вам нужно, вам нужно будет выполнить его итерацию и конкретно указать правильные значения.
Очень трудно иметь дело непосредственно с таким длинным документом JSON. Возвращенный результат со страницы не является допустимым JSON. Он содержит некоторые теги HTML, но если вы берете данные постов и вставляете их в файл, вы можете сделать следующее в соответствии со структурой вашего JSON (Вы можете найти свой JSON во внешней ссылке Вот):
<?php
header("Content-Type:application/json");
$posts=file_get_contents('json.php');
//decode your JSON STRING
$posts=json_decode($posts,true);
//create a title variable to store your titles
$titles=array();
foreach($posts['data']['children'] as $child)
{
array_push($titles,$child['data']['title']);
}
echo json_encode($titles);
?>
Вы даже можете использовать этот подход, используя URL-адрес, но убедитесь, что он вернет действительный JSON без HTML