#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 вместо этого для связи с базой данных)