array_slice (или другие функции array_*) в ArrayObject

У меня вопрос относительно ArrayObject. Я хотел использовать array_slice в классе ArrayObject, но не смог. Есть ли способ сделать это без необходимости писать метод «среза» для класса, реализующего ArrayObject?


person pocesar    schedule 08.07.2011    source источник


Ответы (2)


Наличие класса, который обертывает функции массива php, не такая уж плохая идея. Сделает код намного чище.

echo $myAry->slice(10, 5)->reverse()->join(", ");

Так же, как нормальный язык, вы знаете.

person user187291    schedule 08.07.2011
comment
это выглядит действительно круто @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
comment
Это легко реализовать, но это плохо для памяти. Если это важно, стоит просто реализовать свой собственный класс, подобный ArrayObject, где у вас есть доступ к закрытым данным массива, чтобы вы могли манипулировать ими напрямую. - person Matthew; 08.07.2011
comment
Должен признаться, я понятия не имею о внутренностях ArrayObject. - person hakre; 08.07.2011
comment
Я старался избегать использования getArrayCopy() из-за размера массива (+400 тыс. элементов). - person pocesar; 09.07.2011
comment
Просто любопытно, есть ли причина, которая мешает вам использовать только стандартный массив из первых рук? И/или расширение ArrayObject подходит в вашем случае? - person hakre; 09.07.2011
comment
это результат из базы данных, исходный класс представляет собой ArrayObject с некоторыми дополнительными реализациями (в основном итераторами). расширение этого класса - грязное дело - person pocesar; 10.07.2011
comment
Если вы не хотите иметь дело с копированием массива или расширением самого объекта, вы можете сделать это с помощью декоратора или посетителя. - person hakre; 10.07.2011
comment
ДЖИБУС РАЗЛОМАЕТ ХРОМОСОМУ. Я программирую на PHP уже 15 лет, и я ВСЕ ЕЩЕ узнаю о все новых и новых несоответствиях в API стандартной библиотеки. - person Szczepan Hołyszewski; 03.07.2021
comment
Да, у нас могут быть такие моменты. Может быть, понять тонкую разницу между SPL и базовой библиотекой ^^ - person hakre; 03.07.2021