Обёртка для масива в стиле DOM

AmdY

Пью пиво
Команда форума
Хочется простое управление массивом в стиле DOM. Практически данные хранятся обекте в атрибуте виде обычного ассоциативного массива. Часть операци можно реализовать с помощь array_*, проблемы с позиционной вставкой и заменой значений атрибута.
Это можно реализовать на ArrayObject, но больше ничего хорошего для этого в Spl вроде не появилось
PHP:
$obj = new DOMArray($array);
// простое убравнление элементами: вставка, удаление, замена
$obj->append($node, 'nodeName');
$obj->insertBefore('nodeName', $nodeBefore, 'nodeBeforeName');
$obj->insertAffter('nodeName', $nodeAffter, 'nodeAffterName');
$obj->insertAsFirst($firstName, 'firstNode');
$obj->insertAsLast($lastName, 'lastNode');
$obj->remove('nodeBeforeName');
$obj->replace('nodeName', $replaceNede);

// управление атрибутами
$obj->get('nodeName')->getAttribute('value');
$obj->get('nodeName')->setAttribute('attr_name', 'value');
$obj->get('nodeName')->removeAttribute('value');
 

fixxxer

К.О.
Партнер клуба
Чтобы это работало нормально, надо, чтобы

1) нигде в коде вообще не использовался array

2) все, что может понадобиться от array_-функций, должно присутствовать в этой обертке

это по моему утопия. а с обертками я уже накушался кала вида

function acceptsArray($arr) {
if (!is_array($arr) || !$arr implements MySuperArrayWrapper) throw new InvalidArgumentException('вашу ж мать'); // ну да, завертывается в Assert::isArray()... толку то. вот захочу дальше вместо foreach() тот же array_filter и?
}

говно говно говно. :(
 

AmdY

Пью пиво
Команда форума
fixxxer
согласен. но мне он нужен для узких задач, хотел посмотреть реализации, полноценной замены мне не нужно, да и не получится
собственно проблема, в том, что мне нужен удобный интерфейс для работы с элементами формы.

PHP:
$obj = new Model();
$form = $obj->getForm('add');
if ($this->getUser()->isRoot()) {
    $form->get('submit')->setAttribute('title', 'Сохранить');
    $form->insertBefore('submit', $fieldForRootOnly);
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
было бы неплохо иметь в ArrayAccess метод toArray, который вызывался бы всеми array_* функциями так же, как __toString строковыми

array_filter хорошо делается через колбеки этого враппера и mixin, но восполнение явных недоработок платформы своим кодом противно
 

Духовность™

Продвинутый новичок
Я не понял вопроса до конца. Но у меня так:

Cover_Abstract_Simple - абстрактная обёртка над одномерным массивом.
=>
Cover_Abstract_Array - абстрактный объектный массив.
=>
Cover_Array - конечная реализация объектного массива, с конструктором-сеттером

Данные классы у меня используются многими частями системы. Но как обертка массива это выглядит так:

PHP:
$array = new Cover_Array(array(1, 2, array('key' => 'value')));

print_r($array);
/*
Cover_Array Object
(
    [data:protected] => Array
        (
            [0] => 1
            [1] => 2
            [2] => Cover_Array Object
                (
                    [data:protected] => Array
                        (
                            [key] => value
                        )
                )
        )
)
*/

echo $array[2]['key'] . "\n"; // value
// или
echo $array->item(2)->key . "\n"; // value

$array->append(array('Amdy', 'fixxxer', 'Sad Spirit', 'grigori')); // append

foreach ($array->item($array->count()-1) as $value) {
    echo "$value, "; // Amdy, fixxxer, Sad Spirit, grigori,
}

$array->prepend('Духовность!'); // prepend

var_dump($array->non_exist); // null

$array[4]->clear(); // execute Amdy, fixxxer, Sad Spirit, grigori,

unset($array[0]); // execute Духовность

$array->clear()->setData(array('level1', array('level2', array('level3', array('level4', array('level5'))))));

$array->getDataAsArray(); // as simple array type

$array[] = array(1,2,3); // array автоматом всегда преобразуется в Cover_Array
 

Духовность™

Продвинутый новичок
Это можно реализовать на ArrayObject, но больше ничего хорошего для этого в Spl вроде не появилось
ArrayObject - не рыба, не мясо. Гермофродит, находящийся между обычным array и object. Нелогичный, бесполезный, не ОО.
 

AmdY

Пью пиво
Команда форума
Духовность™
в менеджементе советуют задаваться вопросом какую проблему вы решаете данными действиями. твоё решение не решает ни одной проблемы массивов, только пытается добавить бессмысленной объектности.

Sad Spirit
спасибо, это то что нужно, но нельзя легко интегрировать в свой код. к сожалению, придётся писать самому.
 

Духовность™

Продвинутый новичок
в менеджементе советуют задаваться вопросом какую проблему вы решаете данными действиями
Ну поскольку мой класс так же "нужен для узких задач", то я как бы и не претендую на истинность ))

Только не понятно из твоей реплики - что ты этим хотел сказать? О каких проблемах массива ты говоришь? Тебе нужен insertBefore, insertAffter, insertAsFirst? Они элементарно добавляются в любую обертку. Главное нужно сохранить принцип, при котором добавление массива в объект приводило бы массив к типу Обертка_Массива. Вот и все.
 

Духовность™

Продвинутый новичок
только пытается добавить бессмысленной объектности
гы, ну как бы твое тоже тогда )

У меня просто немного другой подход. Если ты указываешь все чисто в функциональном стиле:
PHP:
$obj->append($node, 'nodeName');
то у меня это выглядит так:
PHP:
$obj->nodeName->append(array('its','new','node')); // или 

$newNode = new Cover_Array();
$newNode->setData(array('its','new','node'));
echo $obj->nodeName->append($newNode)->getLast()->item(0); // return `its`
метод Last придумал только что:
PHP:
    public function getLast()
    {
        $last = end($this->data);
        reset($this->data);
        return $last;
    }
просто спцифичных и мною не востребованных методов типа методов insertBefore, insertAffter, insertAsFirst у меня нет))
 

AmdY

Пью пиво
Команда форума
Духовность™
мне то нужна была лишь позиционная вставка, со всем остальным прекрасно справлялся обычный массив и функции работы с ним.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Духовность™
мне то нужна была лишь позиционная вставка, со всем остальным прекрасно справлялся обычный массив и функции работы с ним.
array_slice, array_splice, ну на крайняк list($k,$v) = each(массив) - помогут решить проблему? )
 
Сверху