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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с рекурсией 
:(
    Опции темы
vonica
Дата 14.1.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Имеем массив:
Код
Array
(
    [0] => Array
        (
            [catId] => 2
            [catTitle] => Магазины
            [catPid] => 0
            [catLogo] => 
            [catPriority] => 0
            [nodes] => Array
                (
                    [0] => Array
                        (
                            [catId] => 3
                            [catTitle] => Продукты питания
                            [catPid] => 2
                            [catLogo] => 
                            [catPriority] => 0
                            [nodes] => Array
                                (
                                    [0] => Array
                                        (
                                            [catId] => 1
                                            [catTitle] => Диетическое питание
                                            [catPid] => 3
                                            [catLogo] => 
                                            [catPriority] => 0
                                        )

                                    [1] => Array
                                        (
                                            [catId] => 7
                                            [catTitle] => Детское питание
                                            [catPid] => 3
                                            [catLogo] => 
                                            [catPriority] => 0
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [catId] => 4
                            [catTitle] => Одежда
                            [catPid] => 2
                            [catLogo] => 
                            [catPriority] => 0
                        )

                    [2] => Array
                        (
                            [catId] => 8
                            [catTitle] => Бытовая техника
                            [catPid] => 2
                            [catLogo] => 
                            [catPriority] => 0
                        )

                )

        )

    [1] => Array
        (
            [catId] => 5
            [catTitle] => Производители
            [catPid] => 0
            [catLogo] => 
            [catPriority] => 0
            [nodes] => Array
                (
                    [0] => Array
                        (
                            [catId] => 6
                            [catTitle] => Мебель
                            [catPid] => 5
                            [catLogo] => 
                            [catPriority] => 0
                        )

                )

        )

)


 вывод с помощью этой функции

Код
function print_array($ar)
{
    static $count; 

    if (is_array($ar)) $count = (isset($count)) ? ++$count : 0;

    if (!is_array($ar)) { return; }
    
    while(list($k, $v) = each($ar)) 
    {
        if ($k=='catTitle') $catTitle=$v;
        if ($k=='catPid' && (!is_array($v))) echo "<option value='$v'>".str_repeat("-", $count).$catTitle.$count."</options><br>";
        if ($k=='nodes' and $v=='Array') --$count;
        if (is_array($v))
        {
            print_array($v);
        }
    }
$count--;
}


Получается такой вот результат:

-Магазины
---Продукты питания
-----Диетическое питание
-----Детское питание
---Одежда
---Бытовая техника
-Производители
---Мебель

А хотелось бы вот так
Магазины
--Продукты питания
---Диетическое питание
---Детское питание
--Одежда
--Бытовая техника
Производители
--Мебель

Подскажите плиз, что подправить в функции, чтобы так получилось.

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

Это сообщение отредактировал(а) vonica - 14.1.2008, 14:19
PM MAIL   Вверх
Sunvas
Дата 14.1.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(vonica @  14.1.2008,  14:18 Найти цитируемый пост)
-Магазины
---Продукты питания
-----Диетическое питание
-----Детское питание
---Одежда
---Бытовая техника
-Производители
---Мебель

А хотелось бы вот так
Магазины
--Продукты питания
---Диетическое питание
---Детское питание
--Одежда
--Бытовая техника
Производители
--Мебель


Убрать по одному первому тире с каждой строки что-ли? substr в помощь.



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
onsql
Дата 14.1.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Надо заменить строку так:
Код

        if ($k=='catPid' && (!is_array($v))) echo "<option value='$v'>".str_repeat("-", (($count - 1)/2)).$catTitle.(($count - 1) / 2 + 1)."</options><br>";


Хитрость там в подсчете уровеня вложенности элемента. Приглядимся к исходному массиву повнимательнее. Допустим исходный массив называется $ar. Тогда элемент "Магазины" доступен по индексу $ar[0]['catTitle'];  элемент "Продукты питания" доступен по индексу $ar[0]['nodes'][0]['catTitle'], и.т.д. Каждая квадратная скобка достигается при рекурсивном вызове print_array(). count увеличивается на 1 при входе в функцию если не проинициализирован. Вот и выходит, что для $ar[0]['catTitle'] count = 1, а для $ar[0]['nodes'][0]['catTitle'] count = 3. Ну и.т.д.

Это сообщение отредактировал(а) onsql - 14.1.2008, 16:54
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.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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