![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| 1234ru |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 26.8.2007 Репутация: -1 Всего: -1 |
Затруднения с символическими ссылками в классах
Перед одним из методов класса стоит задача вернуть значение переменной по переданной ему строке. Строка вида 'key1.key2.key3' соответствует переменной $this->objectarray[key1][key2][key3]. Код для этого я написал следующий (символические ссылки я использовал, чтобы не делать каждый раз копию массива):
При попытке выполнить $this->var_value('строка') мне выдается ошибка:
Подскажите, в чем тут дело. (я вообще в классах не силён; может быть, код для такой задачи можно написать более грамотно?) |
||||
|
|||||
| 1234ru |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 26.8.2007 Репутация: -1 Всего: -1 |
Похоже, проблема не в классах, а в том, что не разрешает переопределять переменную как ссылку на элемент самой себя.
Работает только код вида
Если заменить $var = $var[$key] на $var = &$var[$key] - ошибка. Не хочется каждый раз полную копию делать (чтобы не тратить зря ресурсы). Можно ли как-нибудь без этого обойтись? |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Если Вы используете PHP 5, копия массива не будет создана пока Вы не попробуете изменить данные в одном из массивов.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
А почему сразу целевой элемент не определять?
как вариант использовать цикл не foreach а for с предопределённым количеством элементов в массиве count($keys), соответственно и вложенность. Это сообщение отредактировал(а) Sentox - 1.3.2010, 23:31 |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Sentox, а почему головой нельзя подумать? Вложенность динамическая, от 1 до N.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Читайте мой пост до конца ... Вложенность определяется только количеством элементов в маccиве после explode. Хорошо подумайте и посмотрите что возращает функция. В любом случае функция стремиться проверить целевой элемент, какой бы вложенности он не был, так как при не нахождении возращает FALSE! Это сообщение отредактировал(а) Sentox - 2.3.2010, 15:58 |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Функция возвращает или значение элемента массива или ложь.
Что такое целевой элемент? Можно на примере ? И еще мне не совсем понятно, зачем использовать цикл for. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Элемент массива, цель которого выбрать или проверить.
Можно впринципе и не for, просто нужно сделать указатель на элемент. |
|||
|
||||
| 1234ru |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 26.8.2007 Репутация: -1 Всего: -1 |
А вообще вы знаете... Почему-то такой код вдруг заработал (честно, не знаю почему; сам голову ломаю). Все-таки так можно (в смысле, так, как в первом посте было написано). |
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Точно говорил один из модераторов сперва учи мануал!
Это сообщение отредактировал(а) Sentox - 4.3.2010, 00:46 |
|||
|
||||
| IZ@TOP |
|
||||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Мы не знаем вложенность которую нам надо проверить. Если нам надо пройти до сотого уровня массива, вы предлагаете такой мегагигантский if писать? Может вообще switch(count) { if1... if100} ? -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
||||
|
|||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Если элемента $var[$keys[0]][$keys[1]][$keys[2]]) нет то и вложенности поочерёдно определять смысла не имеет, так как функция сразу обрывается и возращает FALSE.
Цель функции вернуть последний элемент или FALSE. Вложенности можно сформировать перед тем как проверить ОДИН раз:
Это сообщение отредактировал(а) Sentox - 4.3.2010, 23:53 |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Sentox, по-моему тут с логикой явные проблемы. Для того, что бы проверить последний элемент, нужно проверить существование родительских элементов, цепочка которых может быть неопределенной вложенности. Посему, ну никак нельзя делать проверку isset($var[$keys[0]][$keys[1]][$keys[2]]). Впрочем, это можно сделать эвалом, но, имхо, необходимо реализовать задачу без использования костылей и с наименьшей затратой ресурсов.
Приведенный тобой код вообще даже разбирать не стоит, поскольку с него сразу посыпется куча нотисов и стриктов. Автором уже была приведена правильная реализация задачи, поэтому не вижу необходимости выдумывать что-то свое, к тому же еще и кривое, совершенно не понимая как устроен внутренний мир PHP. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
![]()
|
| Правила форума "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. |