У меня вопрос относительно ArrayObject. Я хотел использовать array_slice в классе ArrayObject, но не смог. Есть ли способ сделать это без необходимости писать метод «среза» для класса, реализующего ArrayObject?
array_slice (или другие функции array_*) в ArrayObject
Ответы (2)
Наличие класса, который обертывает функции массива php, не такая уж плохая идея. Сделает код намного чище.
echo $myAry->slice(10, 5)->reverse()->join(", ");
Так же, как нормальный язык, вы знаете.
person
user187291
schedule
08.07.2011
это выглядит действительно круто @hakre. @stereofrog, как получить доступ к данным внутри метода slice() без дублирования данных?
- person pocesar; 09.07.2011
Вы всегда можете работать с копией массива:
$array = $object->getArrayCopy();
// modify $array as needed, e.g. array_slice(....)
$object = new ArrayObject($array);
Когда-то в прошлом была идея сделать так, чтобы все функции, которые принимают массивы (или, возможно, многие из них), также принимали ArrayObject. Но я не знаю, как далеко это зашло и продолжается ли это до сих пор. Я думаю, что ArrayObject — это больше поведенческая вещь, чем фактическая замена собственного массива в PHP.
Связанный вопрос: PHP Array и ArrayObject
person
hakre
schedule
08.07.2011
Это легко реализовать, но это плохо для памяти. Если это важно, стоит просто реализовать свой собственный класс, подобный ArrayObject, где у вас есть доступ к закрытым данным массива, чтобы вы могли манипулировать ими напрямую.
- person Matthew; 08.07.2011
Должен признаться, я понятия не имею о внутренностях ArrayObject.
- person hakre; 08.07.2011
Я старался избегать использования getArrayCopy() из-за размера массива (+400 тыс. элементов).
- person pocesar; 09.07.2011
Просто любопытно, есть ли причина, которая мешает вам использовать только стандартный массив из первых рук? И/или расширение ArrayObject подходит в вашем случае?
- person hakre; 09.07.2011
это результат из базы данных, исходный класс представляет собой ArrayObject с некоторыми дополнительными реализациями (в основном итераторами). расширение этого класса - грязное дело
- person pocesar; 10.07.2011
Если вы не хотите иметь дело с копированием массива или расширением самого объекта, вы можете сделать это с помощью декоратора или посетителя.
- person hakre; 10.07.2011
ДЖИБУС РАЗЛОМАЕТ ХРОМОСОМУ. Я программирую на PHP уже 15 лет, и я ВСЕ ЕЩЕ узнаю о все новых и новых несоответствиях в API стандартной библиотеки.
- person Szczepan Hołyszewski; 03.07.2021
Да, у нас могут быть такие моменты. Может быть, понять тонкую разницу между SPL и базовой библиотекой ^^
- person hakre; 03.07.2021