Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Цепочка свойств неизвестной длины
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
Странная задача передо мной стала.
Есть массив, размер может быть разным и заведомо неизвестен. В массиве записаны имена свойств объектов. Надо сделать запрос цепочки:
Как так сделать прозрачно? Пробовал $c->implode('->',$a); ессно, без результата. На ум идет foreach, но не хочется что то. Не практично foreach, ведь нужна такая конструкция:
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
вообще есть такое понятие как рекурсия, но Viper прав - беда с проектированием.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Anguis
Отправлено: 05 Февраля, 2016 - 07:20:20
Частый гость
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
Ну миллион не приедет, максимум три. OrmaJever, я в курсе что такое рекурсия, но как её тут применить что то ладу не дам.
Проектирование, кмк, вполне ни чего. Поясню. Есть класс настроек. Есть настройки дефолтные, которые загружаются из файла, а есть настройки пользователя, которые загружаются из базы.
Задача в чем. Запросить нужное свойство сначала из объекта пользовательских настроек, если в он в себе такого не содержит, то запросить ту же цепочку из настроек дефолтных. Собсно, в чем беда то?
Поэтому и ищу способ перехватить цепочку запросов и по очереди подставить её сначала к одному объекту, затем к другому. Цепочку в массив записал. Как терь запрос сделать? Что там про рекурсию?
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
Anguis вот с этого и надо начинать. Обычно делают настройки юзера пустыми если нет переназначения, тогда и проверять проще. Если нет юзерской настройки, то используем дефолтную.
Циклами проходитесь и сверяете по последнему элементу, т.е. по 'banner1'
PS! Хотя я бы пересмотрел такое хранение настроек. ИМХО неудобно кучу вложенных массивов дро* каждый раз.
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
DelphinPRO, ну хотя бы потому, что в дефолтном много значений и не все они нужны в каждый конкретный вызов страницы. Обходить 1000 значений из-за используемых 50-ти для текущего вызова мне кажется не рационально..
Viper
Отправлено: 05 Февраля, 2016 - 19:25:27
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
Anguis пишет:
Обходить 1000 значений из-за используемых 50-ти для текущего вызова мне кажется не рационально..
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
Пораскинув тем что осталось в черепной коробке все же пришел к выходу что рекурсивное объединение - единственно верное решение. Иначе не обеспечить прозрачность доступа к свойствам и адекватного возвращения запрашиваемых свойств. Подумалось, а вдруг нужно запросить не финальное свойство, а группу свойств. Т.е. объект. Тут и пришел конец всем рекурсиям, про которые OrmaJever пример давал.. (Добавление) Viper, я утрировал, не буду же я их пересчитывать
DelphinPRO
Отправлено: 05 Февраля, 2016 - 22:07:50
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Anguis пишет:
Обходить 1000 значений из-за используемых 50-ти для текущего вызова мне кажется не рационально..
Блин... Ну обходите пользовательский массив, и значениями из него переписывайте дефолтные. В программе используйте результирующий массив данных.
----- Чем больше узнаю, тем больше я не знаю.
MAXUS
Отправлено: 06 Февраля, 2016 - 08:47:12
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Anguis пишет:
Задача в чем. Запросить нужное свойство сначала из объекта пользовательских настроек, если в он в себе такого не содержит, то запросить ту же цепочку из настроек дефолтных. Собсно, в чем беда то?
Если я правильно понимаю, то задача слить 2 json объекта, чтобы при этом пользовательские установки перезаписали дефолтные. В чем проблема?
name и group1 перезапишется. group2 останется дефолтным. Как гонять из json и обратно - это дело техники. Как превратить итог в объект, дак json_decode по умолчанию сделает объект. А надо массив, поставь true на второй аргумент.
OrmaJever
Отправлено: 06 Февраля, 2016 - 13:21:53
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Anguis пишет:
Подумалось, а вдруг нужно запросить не финальное свойство, а группу свойств. Т.е. объект. Тут и пришел конец всем рекурсиям, про которые OrmaJever пример давал..
Почему-же? нужно просто проверять на конец $arr
Например обьект имеет такую цепочку
$c->prop1->prop2->prop3
а в массиве только ['prop1', 'prop2'], поэтому в функции банально нужно проверять результат функции next на false. Если она вернула false значит нужно вернуть текущее значение, даже если это обьект.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.