Вывести родителей в рекурсии

138
11 сентября 2018, 03:50

написал вывод дерева:

$sql= "SELECT id, parent_id, user_id FROM modxev_programm_one group by `id` asc";
$cats = array();
$statement = $modx->query($sql);
$parent = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($parent as $res) {
    $cats[$res['parent_id']][] =  $res;
}
$tmp = -1;
$count = 0;
function build_tree($cats,$parent_id){
    if(is_array($cats) and count($cats[$parent_id])>0){
        $tree = '<div class="item-children">';
        $count = 0;
         foreach($cats[$parent_id] as $cat){
             $count = $count + 1;
            $tree .= '<div class="item-child">
                        <div class="item">
                            <div class="item-parent">
                                <div class="item-data">
                                    <img src="https://storytsa.com/attach/user/images/1490332239.jpg" alt="">
                                    <div class="span">'.$cat['user_id'].'lj - '.$count.'</div>
                                </div>
                            </div>';
            $tree .=  build_tree($cats,$cat['id']);
            $tree .= '
                </div>
            </div>
            ';         
         }
         $tree .= '</div>';
     } 
     else return null;          
     return $tree; 
}
echo build_tree($cats,2);

для такой структуры

как вывести родителей, у которых нет дочек либо одна?

Answer 1

Может есть смысл хранить в базе NestedSet?

$sqlResult = [
    ['user_id' => 2, 'parent_id' => 1],
    ['user_id' => 1, 'parent_id' => null],
    ['user_id' => 3, 'parent_id' => 1],
    ['user_id' => 4, 'parent_id' => 6],
    ['user_id' => 5, 'parent_id' => 2],
    ['user_id' => 6, 'parent_id' => null],
];
$indexed = [];
foreach ($sqlResult as $row) {
    $indexed[$row['user_id']] = $row;
}
unset($sqlResult);
foreach ($indexed as $row) {
    if (!empty($row['parent_id'])) {
        $indexed[$row['parent_id']]['childs'][$row['user_id']] = &$indexed[$row['user_id']];
    }
}
foreach ($indexed as $index => $row) {
    if ($row['parent_id'] == null) {
        renderTree([$row]);
    }
}
unset($indexed);
function renderTree(array $tree, $level = -1) {
    $level++;
    foreach ($tree as $row){
        echo str_repeat("\t", $level) . $row['user_id'] . "\n";
        if (!empty($row['childs'])) {
            renderTree($row['childs'], $level);
        }
    }
}
READ ALSO
Как отследить приходят ли данные на сервер websocket Ratchet?

Как отследить приходят ли данные на сервер websocket Ratchet?

Сделал по данному примеру https://gostashit/ru/stashes/1533-podklucenie-k-serveru-websocket-iz-web-prilozenia Сервер запускается,

181
Повторы строк php

Повторы строк php

Есть код, который выводит цвета:

163
RedBeanPhp ошибка

RedBeanPhp ошибка

Выдает ошибку

179