Как динамически повторить для всех дочерних элементов массива JSON, которые могут иметь дочерние элементы (PHP) - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь закодировать сайт, который берет комментарии страницы Reddit и показывает их. Тем не менее, комментарии имеют ответы, и я хочу показать их тоже, но комментарий не может иметь ни одного, один или несколько ответов, и эти ответы могут иметь ответы. Есть ли способ повторить один и тот же код для всех ответов с небольшими отличиями (отступ)? Я использую функцию reddit json и получаю JSON примерно так: https://www.reddit.com/r/pcmasterrace/comments/dln0o3/foldinghome_and_pcmr_team_up_use_your_pc_to_help/.json. У меня есть:

$url = ('https://www.reddit.com/r/pcmasterrace/comments/dln0o3/foldinghome_and_pcmr_team_up_use_your_pc_to_help/.json');
$json = file_get_contents($url);
$obj = json_decode($json, true);

$comment_array = array_slice($obj[1]['data']['children'], 0, 50);
echo '<div class="comments">';
foreach ($comment_array as $c) {
    echo "<p>(".$c['data']['author'].") ". $c['data']['score'] . " Points<br>".$c['data']['body']."</p>";
    if (!($c['data']['replies'] == "")) {
        $r1_array = $c['data']['replies']['data']['children'];
        foreach ($r1_array as $r1) {
            echo "<p>    (".$r1['data']['author'].") ". $r1['data']['score'] . " Points<br>    ".$r1['data']['body']."</p>";
            if (!($r1['data']['replies'] == "")) {
                $r2_array = $r1['data']['replies']['data']['children'];
                foreach ($r2_array as $r2) {
                    echo "<p>        (".$r2['data']['author'].") ". $r1['data']['score'] . " Points<br>        ".$r2['data']['body']."</p>";
                }
            }
        }
    }
}
}

Это дает желаемый результат, с ответами на ответы и тому подобное. Однако, это немного грязно, и если есть действительно длинная цепочка ответов, она не поймает ее. Есть ли способ заставить его повторить как-то или я должен просто скопировать и вставить его несколько раз? Большое спасибо!

1 Ответ

0 голосов
/ 07 января 2020

Я думаю, вы ищете концепцию под названием recursion .

Основная идея c заключается в том, что функция будет вызывать себя столько раз, сколько необходимо (в отличие от использования фиксированное количество циклов).

Примерно так:

<?php

function output($data, $level = 0) {
  $spaces = str_repeat(' &nbsp;', $level);
  foreach ($data as $post) {
    echo "<p>(".$spaces.$post['data']['author'].") ". $post['data']['score'] . " Points<br>".$post['data']['body']."</p>\r\n";
    if ($post['data']['replies']) {

      // Notice that we are calling the function again, this time increasing the level
      // This is the "recursive" part of the function
      output($post['data']['replies']['data']['children'], $level + 1);

    }
  }
}

$url = ('https://www.reddit.com/r/pcmasterrace/comments/dln0o3/foldinghome_and_pcmr_team_up_use_your_pc_to_help/.json');
$json = file_get_contents($url);
$data = json_decode($json, true);
$comment_array = array_slice($data[1]['data']['children'], 0, 50);
output($comment_array);

?>
...