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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение массива и впоследствие контроль уровней 
V
    Опции темы
Serious2008
Дата 12.7.2012, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте, у меня есть массив вот такой.


Код

  
    [1] => Array
        (
            [14] => Array
                (
                    [0] => 293
                    [1] => 294
                    [2] => 295
                    [3] => 296
                    [4] => 297
                    [5] => 298
                )

        )

    [36] => Array
        (
            [0] => 2
            [1] => 38
            [2] => Array
                (
                    [0] => 49
                    [1] => 3
                    [2] => 12
                    [4] => 13
                    [5] => 52
                )

            [3] => 40
            [4] => 42
            [5] => 1500
            [40] => Array
                (
                    [0] => 69
                    [1] => 68
                )

        )

    [70] => Array
        (
            [0] => 769
        )


не подскажите функцию, обхода массива с при помощи которого я бы ещё и мог знать на каком я уровне в данный момент?
1, 36, 70 это первый уровень, для 1-цы 14 это второй, а все дети 14-го это 3-ий

Это сообщение отредактировал(а) Serious2008 - 12.7.2012, 10:23
PM MAIL   Вверх
baldina
Дата 12.7.2012, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



PM MAIL   Вверх
Serious2008
Дата 12.7.2012, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



baldina, 
код конечно делает что-то, но я смотрю на вывод и явно не вижу ничего такого, что мне надо.

вот массив мой и что мне выдалось
Код

Array
(
    [14] => Array
        (
            [0] => 293
            [1] => 294
            [2] => 295
            [3] => 296
            [4] => 297
            [5] => 298
        )

)
 0=>293
 1=>294
 2=>295
 3=>296
 4=>297
 5=>298

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


Эксперт
****


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

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



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

Цитата(Serious2008 @  12.7.2012,  15:41 Найти цитируемый пост)
вот массив мой и что мне выдалось

14 - уровень 0, элементы массива уровень 1
Вам выдалось с отступом в один пробел, так что все норм.

Вам осталось понять что делает мой код

Код

<?php

function array_walk_recursive_deep ($array,  $func, $deep = 0) {
  foreach ($array as $key=>$value)
    if (is_array ($value))
       array_walk_recursive_deep ($value,  $func, $deep+1);
    else
       $func ($key, $value, $deep);
}

function print_item ($key, $value, $deep) {
  echo str_repeat (' ', $deep) . "$key=>$value\n";
}

$a = array ('a', array ('b','c'), array('d',array('e')), 'f');

array_walk_recursive_deep ($a, 'print_item');

результат
Код

0=>a
 0=>b
 1=>c
 0=>d
  0=>e
3=>f

array_walk_recursive_deep() осуществляет рекурсивный обход, вызывая callback с параметрами key и value для каждого элемента массива. это практически то же самое, что делает встроенная функция array_walk_recursive(). плюс в callback передается параметр $deep, в котором уровень вложенности.
в моём примере $deep используется для генерации отступов str_repeat (' ', $deep)

Добавлено через 7 минут и 41 секунду
вот вам результат обработки надфилем.
http://codepad.org/KPlJRYqV
такое хотели?
PM MAIL   Вверх
Serious2008
Дата 12.7.2012, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



baldina, 
вот так точно по лучше. А можешь подсказать ещё одну вещь. Как их этого можно будет сделать меню?
Т.е. обвешивать $value, в <li>, а те которые родители в <ul>
Т.е. как это для меню. Не подскажите?
PM MAIL   Вверх
baldina
Дата 12.7.2012, 17:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Добавлено через 2 минуты и 47 секунд
почитайте насчет обхода графа в глубину. у вас частный простейший случай - обход ациклического связного графа, т.е. дерева
PM MAIL   Вверх
Serious2008
Дата 12.7.2012, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



baldina, 
мне нужно на основе этого массива сделать меню, и эти пункты меню вот так и расположены по такому древу. У меня там содержаться только id но из этих id я могу получить всё что мне надо.


Я вот так модифицировал код.


Код

function array_walk_recursive_deep ($array, $deep = 0) {
  foreach ($array as $key=>$value)
    if (is_array ($value)) {
       print_parent ($key, '', $deep);
       array_walk_recursive_deep ($value,  $func, $deep+1);
       echo "</ul>";
    }
    else
      print_item  ($key, $value, $deep);
}

function print_item ($key, $value, $deep) {
  echo "<li>".str_repeat (' ', $deep) . "$key=>$value\n</li>";
}

function print_parent ($key, $value, $deep) {
  echo "<ul><li>".str_repeat (' ', $deep) . "$key=>$value\n</li>";
}


array_walk_recursive_deep ($array_ids_s);



оно как бы хорошо, но есть одна проблема.
Код


 [1] => Array
        (
            [14] => Array
                (
                    [0] => 293
                    [1] => 294
                    [2] => 295
                    [3] => 296
                    [4] => 297
                    [5] => 298
                )

        )


Вот оно так сгенирировало
Код

<ul><li>1=>
</li><ul><li> 14=>
</li><li>  0=>293
</li><li>  1=>294
</li><li>  2=>295
</li><li>  3=>296
</li><li>  4=>297
</li><li>  5=>298
</li></ul></ul>


определённо заметно, что не хватает ещё одного <ul> для тех что дети 14-го
и как не крутил, не получается :(

Это сообщение отредактировал(а) Serious2008 - 12.7.2012, 22:54
PM MAIL   Вверх
Serious2008
Дата 12.7.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



baldina, 
Код


function array_walk_recursive_deep ($array,  $func, $deep = 0) {
  foreach ($array as $key=>$value)
    if (is_array ($value)) {
       print_parent ($key, '', $deep);
       array_walk_recursive_deep ($value,  $func, $deep+1);
       echo "</ul>";
    }
    else
      print_item  ($key, $value, $deep);
}

function print_item ($key, $value, $deep) {
  echo "<li>".str_repeat (' ', $deep) . "$key=>$value\n</li>";
}

function print_parent ($key, $value, $deep) {
  echo "<li>".str_repeat (' ', $deep) . "$key=>$value\n</li><ul>";
}


echo "<ul>";
array_walk_recursive_deep ($array_ids_s , 'print_item');
echo "</ul>";



вот такая модификация кода, решила проблему. Окончательно и полностью.
Сейчас буду дальше уже извращать его, спасибо за помощь.
PM MAIL   Вверх
baldina
Дата 13.7.2012, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



оно сгенерирует неправильный код: <ul> должен быть внутри <li> а не рядом.
Цитата(baldina @  12.7.2012,  17:18 Найти цитируемый пост)
потребуется контролировать проход и вперед и назад

так что надо что-то вроде
Код

function array_walk_recursive_deep ($array, $start_item, $end_item, $start_parent, $end_parent, $deep = 0) {
  $start_parent ($deep);
  foreach ($array as $key=>$value)
    if (is_array ($value)) {
       $start_item ($key, '', $deep);
       array_walk_recursive_deep ($value, $start_item, $end_item, $start_parent, $end_parent, $deep+1);
       $end_item ($key, '', $deep);
    }
    else {
       $start_item ($key, $value, $deep);
       $end_item ($key, $value, $deep);
    }
  $end_parent ($deep);
}
function start_item ($key, $value, $deep) {
  echo str_repeat (' ', $deep) . "<li>$key=>$value";
}
function end_item ($key, $value, $deep) {
  echo "</li>\n";
}
function start_parent ($deep) {
  echo str_repeat (' ', $deep) . "<ul>\n";
}
function end_parent ($deep) {
  echo str_repeat (' ', $deep) . "</ul>";
}
$a = array (14=>array (293,294,295,296,297,298));
array_walk_recursive_deep ($a, 'start_item', 'end_item', 'start_parent', 'end_parent');

учитывая число параметров здесь просится класс
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.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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