Поиск названий в формате JSON - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время у меня есть этот большой файл JSON: hastebin

Но я просто хочу заголовки постов.Я пробовал это ...

$json = $page;
$o = json_decode($json, true);

echo($json);

$titles = $o["*"]["*"]["*"]["*"]["title"];
var_dump($titles);

Но это не работает - он возвращает NULL!Иногда он просто ничего не возвращает.

Если кому-то интересно, да, это от Reddit.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Это должно сделать это:

$titles = array_map(function($post) {
  return $post['data']['title'];
}, $o['data']['children']);

Я не уверен, что вы ожидали, используя "x" индексы, но вам, вероятно, следует прочитать о массивах .

0 голосов
/ 18 октября 2018

Очень трудно иметь дело непосредственно с таким длинным документом 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

0 голосов
/ 18 октября 2018

PHP не может использовать подстановочные знаки, такие как * в ключах массива.Какую бы строку вы ни использовали для ссылки на ключ, она попытается найти ключ с этой точной строкой.То, что вы попробовали, не может работать, потому что нет никаких ключей *.

Вы можете получить это, повторяя все уровни или повторяя внешний уровень и ссылаясь на соответствующий вложенный ключ.Но если вы просто ищете все экземпляры 'title', рекурсивный метод может быть более простым способом их получения.

array_walk_recursive($o, function($value, $key) use (&$titles) {
   if ($key == 'title') $result[] = $value;
});
var_dump($titles);

Это позволит получить любое значение 'title' независимо от его глубины вмассив, так что если это не то, что вам нужно, то вам нужно будет выполнить его итерацию и конкретно указать правильные.

...