Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с алгоритмом..
 
 автор: michail1982   (11.07.2009 в 17:37)   письмо автору
 
 

есть массив
$array = array(0=>array(
                'title'=>'Super 1',
                'parent'=>FALSE,
                'url'=>'#',
                'pos'=>1
                ),
                1=>array(
                'title'=>'Sub 1',
                'parent'=>0,
                'url'=>'#',
                'pos'=>1
                ),
                2=>array(
                'title'=>'Super 2',
                'parent'=>0,
                'url'=>'#',
                'pos'=>2
                )
            );

нужно разобрать его в
<ul>
    <li><a href="#">Super 1</a>
        <ul>
            <li><a href="#">Sub 1</a></li>
        </ul>
    </li>
    <li><a href="#nogo">Super 2</a></li>
</ul>


код писать не обязательно, просто идейку подкиньте.... заранее спасибо

  Ответить  
 
 автор: ....................   (11.07.2009 в 17:40)
 
   для: michail1982   (11.07.2009 в 17:37)
 

У "Super 2" parent стоит "0", в HTML-коде на таком же уровне, как и "Super 1". И как это можно понять?

  Ответить  
 
 автор: MIchail1982   (11.07.2009 в 17:44)   письмо автору
 
   для: ....................   (11.07.2009 в 17:40)
 

parent - индекс родительского элемента массива, т,е super 1 & Super 2 - списки 1го уровня - sub 1 вложен в Super 1(parent=1)
изввените, там 0 || FALSE (некритично)

  Ответить  
 
 автор: GeorgeIV   (11.07.2009 в 18:09)   письмо автору
 
   для: MIchail1982   (11.07.2009 в 17:44)
 

из построения массива и объяснения построение кода никак логически не следует, где то что то надо поменять

  Ответить  
 
 автор: Trianon   (11.07.2009 в 21:54)   письмо автору
 
   для: michail1982   (11.07.2009 в 17:37)
 

Идейку? Пожалуйста.
Попробуйте перенумеровать элементы массива с единицы.

  Ответить  
 
 автор: MIchail1982   (12.07.2009 в 17:50)   письмо автору
 
   для: Trianon   (11.07.2009 в 21:54)
 

СПАСИБО!!!!
если кому пригодиться, вот код
function parse($arrayInput,$parentId = FALSE,$result = ''){
    if(!$parentId){
        $result .= '<ul class="pmenu">';
    } else {
        $result .=  '<ul>';
    }
    foreach($arrayInput as $arrayKey => $arrayVal){
        if($arrayVal['parent']==$parentId){
            $result .= '<li><a href="'.$arrayVal['url'].'">'.$arrayVal['title'].'</a>';
            $result .= parse($arrayInput,$arrayKey);
            $result .= '</li>';
        }
    }
    $result .= '</ul>';
        $result = str_replace('<ul></ul>','',$result);
    return $result;
}
echo parse($array);

  Ответить  
 
 автор: .   (13.07.2009 в 00:30)
 
   для: MIchail1982   (12.07.2009 в 17:50)
 

Жесть какая-то. Передавайте хотя бы $arrayInput по ссылке.

  Ответить  
 
 автор: Trianon   (13.07.2009 в 00:36)   письмо автору
 
   для: .   (13.07.2009 в 00:30)
 

foreach не создает отдельную переменную в контексте вызванного экземпляра рекурсивной функции, а пользуется текущим указателем массива ( как одним из свойств этого объекта).
При использовании ссылки грохнется рекурсия.

Это, конечно, не повод копировать массив. Но просто поставить ссылку будет мало.

  Ответить  
 
 автор: .   (13.07.2009 в 02:22)
 
   для: Trianon   (13.07.2009 в 00:36)
 

> foreach не создает отдельную переменную в контексте вызванного экземпляра рекурсивной функции, а пользуется текущим указателем массива ( как одним из свойств этого объекта).

Замечание: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.

Но одновременно с этим, вроде как и Вы правы насчёт

> При использовании ссылки грохнется рекурсия.

По попробуйте привести пример, когда рекурсия "грохнется" при передаче массива по ссылке и использования foreach. У меня не вышло. Однако, если заменить foreach на while( list(...) = each($arr) ), то "грохается". А ведь разве foreach не "сбрасывает" внутренний указатель массива перед использованием? По мануалу - сбрасывает. А разве each($arr) не использует как раз тот же указатель? Вроде тот же. Но при этом результаты разные.

  Ответить  
 
 автор: .   (13.07.2009 в 02:23)
 
   для: .   (13.07.2009 в 02:22)
 

> По попробуйте привести пример ...

Но попробуйте привести пример ...

  Ответить  
 
 автор: sim5   (13.07.2009 в 02:32)   письмо автору
 
   для: .   (13.07.2009 в 02:22)
 

Из того же мануала: обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал.

  Ответить  
 
 автор: .   (13.07.2009 в 02:50)
 
   для: sim5   (13.07.2009 в 02:32)
 

Где конкретно это в мануале Вы нашли? Там, где я писал, была поправочка: "Unless the array is referenced ...".

  Ответить  
 
 автор: sim5   (13.07.2009 в 11:30)   письмо автору
 
   для: .   (13.07.2009 в 02:50)
 

В мануале РНР4. Не знаю сохранился ли он на оф.сайте или нет, у меня есть.

  Ответить  
 
 автор: Trianon   (13.07.2009 в 02:55)   письмо автору
 
   для: .   (13.07.2009 в 02:22)
 

>Но попробуйте привести пример...
не буду. Неинтересно.
Интереснее было бы написать аналогичный код, который бы и вправду захватывал минимум памяти на рекурсивных вызовах. Не дублируя данные явно или неявно. Это, кстати, касается не только $arrayInput, но и $result.

  Ответить  
 
 автор: .   (13.07.2009 в 14:45)
 
   для: Trianon   (13.07.2009 в 02:55)
 

> Интереснее было бы написать аналогичный код, который бы и вправду захватывал минимум памяти на рекурсивных вызовах.

& добавьте и всё.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования