Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод массива в виде html списка 
V
    Опции темы
reox
Дата 18.4.2008, 15:43 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Есть массив:

Код

$arr = Array
(
    Array
        (
            'title' => '<a href="" title="Root">Root</a>',
            'level' => 0
        )
,
    Array
        (
            'title' => '<a href="main" title="main page">main page</a>',
            'level' => 1
        )
,
    Array
        (
            'title' => '<b>news page</b>',
            'level' => 1
        )
,
    Array
        (
            'title' => '<a href="europe" title="europe">europe</a>',
            'level' => 2
        )
,
    Array
        (
            'title' => '<a href="russian" title="russian">russian</a>',

            'level' => 2
        )
,
    Array
        (
            'title' => '<a href="catalogue" title="catalogue">catalogue</a>',
            'level' => 1
        )
,
    Array
        (
            'title' => '<a href="auto-page" title="auto">auto</a>',
            'level' => 2
        )
,
    Array
        (
            'title' => '<a href="bmw" title="bmw">bmw</a>',
            'level' => 3
        )
,
    Array
        (
            'title' => '<a href="7" title="7">7</a>',
            'level' => 4
        )
,
    Array
        (
            'title' => '<a href="5" title="5">5</a>',

            'level' => 4
        )
,
    Array
        (
            'title' => '<a href="mazda" title="mazda">mazda</a>',
            'level' => 3
        )
,
    Array
        (
            'title' => '<a href="3" title="3">3</a>',
            'level' => 4
        )
,
    Array
        (
            'title' => '<a href="rx-8" title="rx-8">rx-8</a>',
            'level' => 4
        )
,
    Array
        (
            'title' => '<a href="audi" title="audi">audi</a>',
            'level' => 3
        )
,
    Array
        (
            'title' => '<a href="tt" title="tt">tt</a>',

            'level' => 4
        )
,
    Array
        (
            'title' => '<a href="a6" title="a6">a6</a>',
            'level' => 4
        )
,
    Array
        (
            'title' => '<a href="http://flowers.ru" title="flowers">flowers</a>',
            'level' => 2
        )
,
    Array
        (
            'title' => '<a href="rose" title="rose">rose</a>',
            'level' => 3
        )

);


Как вывести в таком стиле (не используя рекурсию):

Код

<ul>
    <li>
        <ul>
            <li></li>
        </ul>
    </li>
</ul>


Есть мысли?
Вывод, используя пробелы, прост (число - уровень вложенности):

    1) main page
    1) news page
        2) europe
        2) russian
    1) catalogue
        2) auto
            3) bmw
                4) 7
                4) 5
            3) mazda
                4) 3
                4) rx-8
            3) audi
                4) tt
                4) a6
        2) flowers
            3) rose 
            
Пока получился вот такой алгоритм, но он работает не корректно:

Код

if ($prev_level < $level)
{
    echo "<ul>";
}
elseif ($prev_level > $level)
{
    echo "</li></ul>";
}
else
{
    echo "</li>";
}
echo "<li>".$url;
$prev_level = $level;


Заранее спасибо.

Это сообщение отредактировал(а) reox - 18.4.2008, 15:45
PM MAIL   Вверх
bars80080
Дата 18.4.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



офигенная задача для профи
Код
$level = 0;
function setNul($x, $y) {
    for($i = 0; $i < $x; $i++) { echo $y; }
}
for($i = 0; isset($arr[$i]); $i++) {
    if($arr[$i]['level'] > $level) { setNul(($arr[$i]['level'] - $level), '<ul>'); }
    elseif($level > $arr[$i]['level']) { setNul(($level - $arr[$i]['level']), '</ul>'); }
    echo '<li>'.$arr[$i]['title'].'</li>'; $level = $arr[$i]['level'];
}

PM MAIL WWW   Вверх
krundetz
Дата 18.4.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Код

$size = count($ca);
echo '<div class="spisok" style="margin-top:15px;">';
for($i = 0, $g = 0; $i < $size; $i++)
{ 

    if($i != $size - 1)
    {
        if($g < $this->i[$i + 1])
        {
            echo '<div>';
        }
        if($g == $this->i[$i + 1])
        {
            echo '<div></div>';
        }
        if($g > $this->i[$i + 1])
        {
                echo '<div></div>';
            $s = $g - $this->i[$i + 1];
            for($j = 0; $j < $s; $j++)
            {
                echo '</div>';
            }
        }
        $g = $this->i[$i + 1];
    }
    else
    {
        echo '<div></div>';
        $s = $g;
        for($j = 0; $j < $s; $j++)
        {
            echo '</div>';
        }
    }
}
echo '</div>';

вот примерно тоже самое но толлько с вложеными div -ами
где $this->i масив вложеностей


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
skyboy
Дата 18.4.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260




M
skyboy
Не надо думать, что профессионалы, способные ответить на Ваш вопрос сидят только \"РНР: Для профи\". В этом разделе рассматриваются каверзные вопросы. И темы создавать - только если абсолютно уверены, что вопрос экстраординарен и абсолютно сложен.

Остальные вопросы размещайте согласно тематики или в \"PHP: Общие вопросы\".

PM MAIL   Вверх
reox
Дата 21.4.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Спасибо за помощь smile
Все хорошо, только предложенное решение bars80080 не валидно.
Получается что то вроде:

Код

<li><a href="" title="Root">Root</a></li>
    <ul>
        <li><a href="main" title="main page">main page</a></li>
        <li><b>news page</b></li>
            <ul>
                <li><a href="europe" title="europe">europe</a></li>
                <li><a href="russian" title="russian">russian</a></li>
            </ul>
            <li><a href="catalogue" title="catalogue">catalogue</a></li>
                <ul>
                    <li><a href="auto-page" title="auto">auto</a></li>
                        <ul>
                            <li><a href="bmw" title="bmw">bmw</a></li>
                                <ul>
                                    <li><a href="7" title="7">7</a></li>
                                    <li><a href="5" title="5">5</a></li>
                                </ul>
                            <li><a href="mazda" title="mazda">mazda</a></li>
                                <ul>
                                    <li><a href="3" title="3">3</a></li>
                                    <li><a href="rx-8" title="rx-8">rx-8</a></li>
                                </ul>
                            <li><a href="audi" title="audi">audi</a></li>
                                <ul>
                                    <li><a href="tt" title="tt">tt</a></li>
                                    <li><a href="a6" title="a6">a6</a></li>
                                </ul>
                        </ul>
                    <li><a href="http://flowers.ru" title="flowers">flowers</a></li>
                        <ul>
                            <li><a href="rose" title="rose">rose</a></li>

PM MAIL   Вверх
bars80080
Дата 21.4.2008, 15:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ёпрст, так закрыть же нужно все ul
Код
$level = -1;
function setNul($x, $y) {
    for($i = 0; $i < $x; $i++) { echo $y; }
}
for($i = 0; isset($arr[$i]); $i++) {
    if($arr[$i]['level'] > $level) { setNul(($arr[$i]['level'] - $level), '<ul>'); }
    elseif($level > $arr[$i]['level']) { setNul(($level - $arr[$i]['level']), "</ul>\r\n"); }
    echo '<li>'.$arr[$i]['title']."</li>\r\n"; $level = $arr[$i]['level']; }
setNul(($level + 1), "</ul>\r\n");


Это сообщение отредактировал(а) bars80080 - 21.4.2008, 15:14
PM MAIL WWW   Вверх
awers
Дата 21.4.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



bars80080, теперь становится понятно что люди берутся за php без понятия об html )
PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 21.4.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



издержки образования из-под палки
PM MAIL WWW   Вверх
reox
Дата 21.4.2008, 15:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Думаю так правильнее:

Код

<ul>
  <li>a
    <ul>
      <li>1</li>
      <li>2</li>
    </ul>
  </li>
  <li>b</li>
</ul>

PM MAIL   Вверх
bars80080
Дата 21.4.2008, 16:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



значит надо было немного доработать
Код
$level = -1;
function setNul($x, $y) {
    for($i = 0; $i < $x; $i++) { echo $y; }
}
for($i = 0; isset($arr[$i]); $i++) {
    if($arr[$i]['level'] > $level) { setNul(($arr[$i]['level'] - $level), '<ul>'); }
    elseif($level > $arr[$i]['level']) { setNul(($level - $arr[$i]['level']), "</li></ul></li>\r\n"); }
    echo '<li>'.$arr[$i]['title']."\r\n"; $level = $arr[$i]['level'];
    if(!empty($arr[$i + 1]['level'])) {
        if($arr[$i + 1]['level'] == $level) echo "</li>\r\n"; }
}
 такая устроит?



Это сообщение отредактировал(а) bars80080 - 21.4.2008, 16:17
PM MAIL WWW   Вверх
reox
Дата 22.4.2008, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Спасибо smile Вот что получилось:

Код

<ul>
    <li><a href="" title="Root">Root</a>
        <ul>
            <li><a href="main" title="main page">main page</a></li>
            <li><b>news page</b>
                <ul>
                    <li><a href="europe" title="europe">europe</a></li>
                    <li><a href="russian" title="russian">russian</a></li>
                </ul>
            </li>
            <li><a href="catalogue" title="catalogue">catalogue</a>
                <ul>
                    <li><a href="auto-page" title="auto">auto</a>
                        <ul>
                            <li><a href="bmw" title="bmw">bmw</a>
                                <ul>
                                    <li><a href="7" title="7">7</a></li>
                                    <li><a href="5" title="5">5</a></li>
                                </ul>
                            </li>
                            <li><a href="mazda" title="mazda">mazda</a>
                                <ul>
                                    <li><a href="3" title="3">3</a></li>
                                    <li><a href="rx-8" title="rx-8">rx-8</a></li>
                                </ul>
                            </li>
                            <li><a href="audi" title="audi">audi</a>
                                <ul>
                                    <li><a href="tt" title="tt">tt</a></li>
                                    <li><a href="a6" title="a6">a6</a></li>
                                </ul>
                            </li>
                        </li>
                    </ul>
                </li>
                <li><a href="http://flowers.ru" title="flowers">flowers</a>
                    <ul>
                        <li><a href="rose" title="rose">rose</a>


Количество <ul> = 9
Количество </ul> = 5
Количество <li> = 18
Количество </li> = 15

Ошибки начинаются с 33 строки.
PM MAIL   Вверх
bars80080
Дата 22.4.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



reox, честно говоря никогда не задумывался над валидацией и до сих пор никогда это боком не выходило
сделав скрипт, я отладил его до состояния, когда он показывал то что мне было нужно
если он и теперь упускает какие-то закрывающие тэги, то я их просто уже не вижу

здесь надо уже доработать чисто методом тыка, ибо у меня осмыслением уже не получается
если отладишь до абсолютно правильного состояния и выложишь сюда, только спасибо скажем
PM MAIL WWW   Вверх
reox
Дата 28.4.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Вот валидное решение:

Код

$prev_level = -1;

foreach ($arr as $key=>$val)
{
    if ($val['level'] > $prev_level)
    {
        print "<ul>\n";
        $prev_level = $val['level'];
    }
    elseif ($val['level'] < $prev_level)
    {
        print str_repeat("</ul>\n", $prev_level-$val['level']);
        $prev_level = $val['level'];
    }
    
    print "<li>".$val['level'].')'.$val['title']."\n";
}
print str_repeat("</ul>\n", $val['level']+1);


Результат работы:

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<title>test</title>
<body>

<ul>
    <li><a href="" title="Root">Root</a>
        <ul>
            <li><a href="main" title="main page">main page</a>
            <li><b>news page</b>
                <ul>
                    <li><a href="europe" title="europe">europe</a>
                    <li><a href="russian" title="russian">russian</a>
                </ul>
            <li><a href="catalogue" title="catalogue">catalogue</a>
                <ul>
                    <li><a href="auto-page" title="auto">auto</a>
                        <ul>
                            <li><a href="bmw" title="bmw">bmw</a>
                                <ul>
                                    <li><a href="7" title="7">7</a>
                                    <li><a href="5" title="5">5</a>
                                </ul>
                            <li><a href="mazda" title="mazda">mazda</a>
                                <ul>
                                    <li><a href="3" title="3">3</a>
                                    <li><a href="rx-8" title="rx-8">rx-8</a>
                                </ul>
                            <li><a href="audi" title="audi">audi</a>
                                <ul>
                                    <li><a href="tt" title="tt">tt</a>
                                    <li><a href="a6" title="a6">a6</a>
                                </ul>
                        </ul>
                    <li><a href="http://flowers.ru" title="flowers">flowers</a>
                        <ul>
                            <li><a href="rose" title="rose">rose</a>
                        </ul>
                </ul>
        </ul>
</ul>

</body>
</html>


Это сообщение отредактировал(а) reox - 28.4.2008, 11:46
PM MAIL   Вверх
bars80080
Дата 28.4.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



?

а где закрывающие тэги </li>

?
PM MAIL WWW   Вверх
reox
Дата 28.4.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Почитав спецификацию, оказалось, что можно не закрывать <li>. Протестировал на http://validator.w3.org/#validate_by_input
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0748 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.