Извлеките больше из многомерного массива, чтобы поместить в рекурсивную функцию foreach

#php #recursion

#php #рекурсия

Вопрос:

Я пытаюсь узнать больше о многомерных массивах наряду с рекурсивными функциями, поэтому в качестве упражнения у меня есть раздел комментариев с потоками. у каждого комментария (в базе данных) есть идентификатор, родительский идентификатор (по умолчанию 0, но это будет идентификатор комментария, на который он отвечает) и содержимое плюс многое другое.

Я следовал руководству и придумал наполовину законченное решение, однако я могу извлечь только часть данных массива с помощью моего текущего решения. Я хочу иметь возможность извлекать дополнительную информацию, такую как ‘AuthorID’, ‘commentDate’ и все, что я пытался до сих пор сделать, привело к массовому сбою. Вот мой код на данный момент, это рекурсивная функция (внутри класса):

     function makeList($parentId) {

    // Need the main $comms array:
    global $comms;

    echo '<ul>'; // Start an unordered list.


    // Loop through each subarray:
        foreach ($parentId as $comm_id => $theCommName) {

            // Display the comment:
            echo "<li>".$theCommName;

        // Check for sub comments:
                if (isset($comms[$comm_id])) { 
                    // Call this function again:
                    self::makeList($comms[$comm_id]);
                }

        echo '</li>'; // Complete the list item.

    } // End of FOREACH loop.

    echo '</ul>'; // Close the ordered list.

} // End of  function.
  

и вот еще одна функция, которая подключается к базе данных для извлечения комментариев и использует предыдущую функцию:

     function callCommentList($pid){

    // Connect to the database:
    $dbc = mysqli_connect(HOST_NAME, USERNAME, PASSWORD, DB_NAME);

    // Retrieve all the comments from a particular post:
    $q = 'SELECT id, parentId, content, authorId, postId, commentDate, approved FROM comments WHERE postId='.$pid.' AND approved=1 ORDER BY parentId, commentDate ASC'; 
    $r = mysqli_query($dbc, $q);

    // Initialize the storage array:
    global $comms;
    $comms = array();

    // Loop through the results:
    while (list($commsId, $commParentId, $theComm, $authorId, $postId, $commentDate, $approved) = mysqli_fetch_array($r, MYSQLI_NUM)) {
        // Add to the array:
        $comms[$commParentId][$commsId] =  $theComm;
    }        

    self::makeList($comms[0]);

}
  

и на другой странице я создал экземпляр класса и вызвал метод:

 $post->callCommentList($post->getId())
  

Вот результат (неупорядоченный список):
введите описание изображения здесь

В идеале, однако, я также хотел бы получить другую информацию, извлеченную из базы данных, такую как AuthorID и т.д., И отобразить ее с комментарием (и многое другое). Есть идеи о том, как это сделать?

Комментарии:

1. Пожалуйста, рассмотрите возможность ознакомления с внедрением SQL и устаревшими mysql-* функциями. Прекратите их использовать. Это плохая практика.

2. @doitmyway, который я использую mysqli_ однако, я на самом деле собираюсь реорганизовать это, чтобы использовать PDO и установить fetchmode как FETCH_CLASS , поскольку у меня есть класс Comments

Ответ №1:

Хорошо, я неправильно собирался хранить элементы в массиве.

В моем исходном коде я хранил ТОЛЬКО содержимое комментария на три уровня глубже, однако я понял, что могу также хранить другие вещи, которые мне нужны, на три уровня глубже (идентификатор автора дата комментария), и сделал это таким образом:

         while (list($commsId, $commParentId, $theComm, $authorId, $postId, $commentDate, $approved) = mysqli_fetch_array($r, MYSQLI_NUM)) {

        // Add to the array the comment, the comment's author, the comment's date:
        $comment = array($theComm, $authorId, $commentDate);
        $comms[$commParentId][$commsId] =  $comment;

    }
  

которая будет равна этому, когда массив напечатан аккуратно:

 Array
(
    [0] => Array
        (
            [1] => Array
                (
                    [0] => Comment One
                    [1] => 3
                    [2] => 2014-07-06 21:16:19
                )

        [4] => Array
            (
                [0] => Third Comment That does not reply to anything
                [1] => 3
                [2] => 2014-07-06 21:24:12
            )

    )

[1] => Array
    (
        [2] => Array
            (
                [0] => Comment That's In Response To Comment One
                [1] => 3
                [2] => 2014-07-06 21:17:03
            )

    )
)
  

итак, оттуда я мог легко видеть, что я мог бы просто извлекать детали через индекс, поэтому пересмотренный рекурсивный метод выглядит следующим образом:

     function makeList($parentId) {

    // Need the main $comms array:
    global $comms;

    echo '<ul>'; // Start an unordered list.


    // Loop through each subarray:
        foreach ($parentId as $comm_id => $theComm) {

            // Display the item:
            echo "<li>";
            echo "<strong>Id:</strong> ".$comm_id."<br/>";
            echo "<strong>The Comment</strong> : ".$theComm[0]."<br/>";
            echo "<strong>Author Id:</strong> ".$theComm[1]."<br/>";
            echo "<strong>Comment Date:</strong> ".$theComm[2];
        // Check for comments:
                if (isset($comms[$comm_id])) { 
                    // Call this function again:
                    self::makeList($comms[$comm_id]);
                }

        echo '</li>'; // Complete the list item.

    } // End of FOREACH loop.

    echo '</ul>'; // Close the unordered list.

}
  

и теперь у меня есть доступ ко всем элементам массива, которые мне нужны:
введите описание изображения здесь

просто нужно очистить код (и использовать PDO вместо этого для связи с базой данных)