Массив перемещения и отображение в точках маркера - PullRequest
0 голосов
/ 02 сентября 2011

Я хочу пройти через этот массив и отобразить 'comment' в виде маркеров.

Array
(
    [1] => Array
        (
            [id] => 1
            [comment] => a
            [parent_id] => 0
            [children] => Array
                (
                    [3] => Array
                        (
                            [id] => 3
                            [comment] => c
                            [parent_id] => 1
                            [depth] => 0
                            [child_count] => 0
                            [children] => 
                        )

                    [4] => Array
                        (
                            [id] => 4
                            [comment] => d
                            [parent_id] => 1
                            [depth] => 0
                            [child_count] => 0
                            [children] => 
                        )

                )

            [depth] => 1
            [child_count] => 2
        )

    [2] => Array
        (
            [id] => 2
            [comment] => b
            [parent_id] => 0
            [children] => Array
                (
                    [5] => Array
                        (
                            [id] => 5
                            [comment] => e
                            [parent_id] => 2
                            [children] => Array
                                (
                                    [7] => Array
                                        (
                                            [id] => 7
                                            [comment] => g
                                            [parent_id] => 5
                                            [children] => Array
                                                (
                                                    [8] => Array
                                                        (
                                                            [id] => 8
                                                            [comment] => h
                                                            [parent_id] => 7
                                                            [children] => Array
                                                                (
                                                                    [9] => Array
                                                                        (
                                                                            [id] => 8
                                                                            [comment] => h
                                                                            [parent_id] => 8
                                                                            [children] => Array
                                                                                (
                                                                                    [10] => Array
                                                                                        (
                                                                                            [id] => 8
                                                                                            [comment] => h
                                                                                            [parent_id] => 9
                                                                                            [depth] => 0
                                                                                            [child_count] => 0
                                                                                            [children] => 
                                                                                        )

                                                                                )

                                                                            [depth] => 1
                                                                            [child_count] => 1
                                                                        )

                                                                )

                                                            [depth] => 2
                                                            [child_count] => 1
                                                        )

                                                )

                                            [depth] => 3
                                            [child_count] => 1
                                        )

                                )

                            [depth] => 4
                            [child_count] => 1
                        )

                    [6] => Array
                        (
                            [id] => 6
                            [comment] => f
                            [parent_id] => 2
                            [depth] => 0
                            [child_count] => 0
                            [children] => 
                        )

                )

            [depth] => 5
            [child_count] => 2
        )

)

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Вам нужно немного рекурсии

function traverse_array($array)
{
    echo '<ul>';
    foreach($array as $element)
    {
        echo '<li>';
        if(isset($element['comment']))
        {
            echo $element['comment'];
        }
        if(is_array($element['children']) && count($element['children']) > 0)
        {
            traverse_array($element['children']);
        }

        echo '</li>';
    }
    echo '</ul>';
}

traverse_array($the_big_array);
0 голосов
/ 02 сентября 2011

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

function hierTree($arr, $tag = 'ul', $key = 'comment', $lvl = 0)
{
    $tabs = (!$lvl)? '': str_repeat("\t", $lvl);
    reset($arr);
    echo "$tabs<$tag>\n";
    while (list(, $v) = each($arr))
    {   
        echo "$tabs\t<li>";
        echo "{$v[$key]}";
        if (count($v['children']))
        {   
            echo "\n";
            hierTree($v['children'], $tag, $key, $lvl +1);
            echo "$tabs\t";
        }   
        echo "</li>\n";
    }   
    echo "$tabs</$tag>\n";
}

hierTree($tree);

Вывод этой функции будет с хорошим отступом , чтобы она была легко читаемой.

Кроме того, если вы сделаете hierTree($tree, 'ol'); you will get an ordered list. Id you do hierTree($tree, 'ol', 'id'); Вы получите упорядоченное дерево, и вместо поля по умолчанию comment будет напечатано поле id . Вставка классов.

Если вы хотите, чтобы в каждом элементе list были разные классы, чтобы вам было проще создавать стили в CSS.(хотя я бы рекомендовал использовать прямые селекторы CSS («>»))

function hierTree($arr, $tag = 'ul', $key = 'comment', $lvl = 0)
{
    $tabs = (!$lvl)? '': str_repeat("\t", $lvl);
    reset($arr);
    echo "$tabs<$tag class=\"depth$lvl\">\n"; // ← The change is there.
    while (list(, $v) = each($arr))
    {   
        echo "$tabs\t<li>";
        echo "{$v[$key]}";
        if (count($v['children']))
        {   
            echo "\n";
            hierTree($v['children'], $tag, $key, $lvl +1);
            echo "$tabs\t";
        }   
        echo "</li>\n";
    }   
    echo "$tabs</$tag>\n";
}

Эта слегка измененная версия будет печатать глубинаN класс для список элемент,Таким образом, вы можете настроить таргетинг на их * LI * с помощью простого правила CSS, такого как ul.depth1 > li { ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...