![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| s1lver |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Доброго времени суток!
Подскажите, пожалуйста, такой вопрос. Есть массив вида
как можно вывести все значения из массива, чтобы получился список типа
Набросал код, но не могу понять как учесть вложенные значения
Это сообщение отредактировал(а) s1lver - 5.5.2014, 14:23 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||||
|
|||||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Как-то так, наверное
Можно почитать в гугле или википедии про рекурсию ;) Это сообщение отредактировал(а) Aliance - 5.5.2014, 14:45 |
|||
|
||||
| s1lver |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Хм, тут что-то не так. Возможно, я не правильно вопрос поставил.
-------------------- Я собрался жить вечно - пока все идет нормально! |
|||
|
||||
| s1lver |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
т.е по сути (из прошлого вопроса) получаем из массива 1 значения, на основании которых ищем в массиве 2 совпадения со значениями. Если найдены совпадения, то выводим ключи(в единственном экземпляре).
массив 2
Но, так можно получить только верхний уровень. Второй уровень вложенности можно получить аналогично, только подставив массив 3, в котором хранятся значения второго уровня вложенности(массив 3, в этом случае, аналогичен массиву 2). А вот как объединить их, чтобы значения полученные в массиве 3, соответствовали массиву 2? Поэтому, я подумал что стоит объединить два массива для простоты. Это сообщение отредактировал(а) s1lver - 5.5.2014, 15:55 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||
|
|||||
| s1lver |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Вот это, практически, то что надо.
Однако, есть проблема. Если есть более одного уровня вложенности, то эти элементы выводятся внизу списка. Т.е
Подскажите, как быть? Это сообщение отредактировал(а) s1lver - 6.5.2014, 10:13 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||
|
|||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Совершенно не понятно, что нужно, потому что выражаете свои мысли очень сумбурно
|
|||
|
||||
| s1lver |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Необходимо вывести список с двумя уровнями вложенности. Т.е, чтобы структура была такая.
Есть исходный массив, в котором хранятся id.
id первого и второго уроня могут совпадать Есть массив 1, в котором в качестве ключей хранятся описания id первого уровня вложенности, а в качестве значений id первого уровня вложенности. Есть массив 2, в котором в качестве ключей хранятся описания id второго уровня вложенности, а в качестве значений id второго уровня вложенности. Чтобы вытащить и обработать значения массива, я написал такой код
Сперва, для первого уровня вложенности, получаем id из исходного массива и подставляем к полученным id описание из массива1. Т.к описание должно быть в единственном экземпляре, то обрезаю повторяющиеся элементы(подозреваю, что где-то тут накосячил). Потом получаем значения для id второго уровня вложенности. Из всего этого формируется список.
Т.е список формируется отлично только для первых найденных значений. А когда найдено совпадающее значение в первом уровня, оно убирается и остается только второй уровень. Но его надо добавлять в свой первый уровень. Это сообщение отредактировал(а) s1lver - 6.5.2014, 11:01 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||||||
|
|||||||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Вы очень усложняете. Мне нужно лишь массив (или массивы, их уже оказывается два?) с реальными значениями (как в первом посте) и разметка, которая д.б. сгенерирована на основе этих же значений. А вы приводите пример абстрактной разметки, которую можно интерпритировать по разному.
|
|||
|
||||
| s1lver |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Исходный массив заполнил тестовыми значениями
Массив 1 заполненный тестовыми значениями
Массив 2 заполненный тестовыми значениями
Приведенный, в прошлом посте код, реально выводит следующий список
а нужно, чтобы было так
-------------------- Я собрался жить вечно - пока все идет нормально! |
||||||||||
|
|||||||||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Вот, уже практически понятно. В коде я видел у элемента li был атрибут id, в последнем посту в верстке его нет. Он не нужен или забыли?
Что значит "исходный массив" я не очень понял. Из него получаются массивы 1 и 2 или что? Чем массивы 1 и 2 отличаются друг от друга? |
|||
|
||||
| s1lver |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Да, id забыл, т.к набирал в ручную код. Id содержат значения id из изходного массива(тоже успешно подставляются).
Исходный массив - в нем хранятся id для первого и второго уровня списка. Формируется динамически(повлиять на него нет возможности). А массив1 и массив2 уже существуют(можно изменить как угодно), и хранят только описания для id из исходного массива. Это сообщение отредактировал(а) s1lver - 6.5.2014, 12:15 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||
|
|||||
| Aliance |
|
||||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Давно понятно, что исходный массив менять нет возможности, но какой он в рамках других тестовых данных - так и не понятно. Я совместил те куски кода, что были выше с конкретными значениями, получилось следующее. Если что-то не так - подправьте ПРЯМО В КОДЕ, хватит путать ;)
Выводит
И напишите при таких данных какой output будет правильным? Добавлено через 2 минуты и 28 секунд Вообще код внутри цикла явно бажный. Скорее всего нужно как-то так:
|
||||||
|
|||||||
| s1lver |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Исходный массив $elementsArray, я привел на основании вывода var_dump($elementsArray). Если заполнить его более понятными элементами, то вывод происходит такой Категория1 Подкатегория1 Категория6 Подкатегория2 Категория2 Подкатегория3 Категория3 Подкатегория4 Категория4 Подкатегория5 Категория5 Подкатегория6 Подкатегория7 и код
Т.е в принципе, то что нужно. Однако, этот же код, не верно работает если подставлять реальный исходный массив Вот, так
уже не работает правильно. Это сообщение отредактировал(а) s1lver - 6.5.2014, 16:29 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||||
|
|||||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Аллилуйя, спустя сутки мы поняли задачу
Что бы я посоветовал. У вас получается исходный массив (в примере $elementsArray) состоит из блоков по 4 значения. Конечно непонятно почему его нельзя изменить, но допустим что это так, тогда мы можем воспользоваться функцией array_chunk. Далее, я не люблю функцию array_search (O(n)), предпочитаю пользоваться функцией isset (O(1)) - соответственно предлагаю поменять ключи и значения в массивах "местами", чтобы была хеш-таблица. Если нет такой возможности, есть функция array_flip. Еще, не до конца понял, соответствия двух массивов один-к-одному или может не быть подкатегории? В общем если второе - то нужно проверку isset, иначе просто доступ по индексу. Получается примерно следующее:
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |