php html отображает иерархические данные - PullRequest
0 голосов
/ 29 апреля 2011

У меня есть массив ($ title, $ deep)

$title($depth)
////////////////////////////////////
ELECTRONICS(0)
    TELEVISIONS(1)
        TUBE(2)
        LCD(2)
        PLASMA(2)
    PORTABLE ELECTRONICS(1)
        MP3 PLAYERS(2)
            FLASH(3)
        CD PLAYERS(2)
        2 WAY RADIOS(2)
//////////////////////

Как я могу отобразить эту структуру с <ul><li>

Ответы [ 2 ]

0 голосов
/ 29 апреля 2011

Вы можете использовать рекурсивную функцию, подобную этой.

$data = array(
    'electronics' => array(
        'televisions' => array(
            'tube',
            'lcd',
            'plasma',
        ),
        'portable electronics' => array(
            'MP3 players' => array(
                'flash',
            ),
            'CD players',
            '2 way radios',
        ),
    ),
);

function build_ul($contents){
    $list = "<ul>\n";

    foreach($contents as $index => $value){
        if(is_array($value)){
            $item = "$index\n" . build_ul($value);
        } else {
            $item = $value;
        }
       $list .= "\t<li>$item</li>\n";
    }

    $list .= "</ul>\n";

    return $list;
}


print build_ul($data);

Вам нужно будет изменить функцию, чтобы добавить числа, отображающие итоги для категории.

Обратите внимание: поскольку PHP не оптимизирован для обработки рекурсивных функций, таких как некоторые другие языки (например, Lisp), вы можете столкнуться с проблемами производительности, если у вас большие объемы данных. С другой стороны, если у вас иерархическая структура глубже, чем три или, может быть, четыре уровня, вы все равно начнете сталкиваться с проблемами, потому что на одной веб-странице трудно разумно отобразить такую ​​иерархию.

0 голосов
/ 29 апреля 2011

Основы этого ... отслеживайте глубину и распечатывайте теги <ul> и </ul>, чтобы сместить глубину к текущей глубине. Помните, что HTML не требует тегов </li>, и это облегчает жизнь. Вы можете просто распечатать <li> перед каждым элементом и позволить элементам закрываться при необходимости.

Теперь, что касается особенностей просмотра вашего списка, это зависит от структуры (которой на момент редактирования вы не хотели делиться). Однако есть два разумных способа структурировать такой список.

$depth = -1;
// May be foreach($arr as $title => $itemDepth), depending on the structure
foreach ($arr as $item)
{
    // if you did the 'other' foreach, get rid of this
    list($title, $itemDepth) = $item;

    // Note, this only works decently if the depth increases by
    // at most one level each time.  The code won't work if you
    // suddenly jump from 1 to 5 (the intervening <li>s won't be
    // generated), so there's no sense in pretending to cover that
    // case with a `while` or `str_repeat`.
    if ($depth < $itemDepth)
        echo '<ul>';
    elseif ($depth > $itemDepth)
        echo str_repeat('</ul>', $depth - $itemDepth);

    echo '<li>', htmlentities($title);
    $depth = $itemDepth;
}

echo str_repeat('</ul>', $depth + 1);

Это не будет генерировать действительный XHTML. Но большинство людей все равно не должны использовать XHTML.

...