В этой статье описывается метод получения всех дочерних и дочерних узлов. для указанного родителя, использующего PHP с результатами запроса MySQL. Этот метод устраняет необходимость построения многомерного массива древовидной структуры и позволяет получать все узлы напрямую.
Рассмотрим таблицу MySQL, организованную в виде списка смежности, где данные иерархии представлены столбцами для идентификатора, имени и родительский_ид. Следующий SQL-запрос может извлечь все строки из этой таблицы в ассоциативный массив:
$r = mysql_query("SELECT * FROM test "); $data = array(); while($row = mysql_fetch_assoc($r)) { $data[] = $row; }
Предположим, мы хотим отфильтровать этот массив для узлов под родительским элементом с идентификатором 3, включая самого родителя. Эта пользовательская функция fetch_recursive может выполнить это:
function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array()) { foreach($src_arr as $row) { if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid) { $rowdata = array(); foreach($row as $k => $v) $rowdata[$k] = $v; $cats[] = $rowdata; if($row['parent_id'] == $currentid) $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true)); } } return $cats; }
Чтобы использовать эту функцию, передайте массив $data, полученный из запроса, в качестве первого аргумента и идентификатор родительского узла, для которого вы хотите получить дочерние узлы, в качестве второго аргумента:
$list = fetch_recursive($data, 3);
$list теперь будет содержать ассоциативный массив со всеми дочерними узлами и включенным родительским узлом (id 3).
Это решение эффективно извлекает все дочерние узлы и узлы-потомки для указанного родителя без необходимости построения многомерной древовидной структуры.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3