Сброс значения внутреннего указателя в массиве PHP (ArrayObject) - PullRequest
2 голосов
/ 02 сентября 2010

Рассмотрим простой PHP ArrayObject с двумя элементами.

$ao = new ArrayObject();
$ao[] = 'a1';  // [0] => a1
$ao[] = 'a2';  // [1] => a2

Затем удалите последний элемент и добавьте новый.

$ao->offsetUnset(1);
$ao[] = 'a3';  // [2] => a3

Мне бы очень хотелось, чтобы у 'a3' было [1].

Как я могу сбросить значение внутреннего указателя до добавить 'a3'?

У меня есть простая функция, которая делает это, но я бы не стал копировать массив, если мне это не нужно.

function array_collapse($array) {
    $return = array();
    while ($a = current($array)) {
        $return[] = $a;
        next($array);
    }
    return $return;
}

Ответы [ 3 ]

2 голосов
/ 02 сентября 2010

С расширением вопроса в ваших комментариях: вам нужно расширить класс ArrayObject, чтобы получить такой тип поведения:

class ReindexingArray extends ArrayObject {
    function offsetUnset($offset){
        parent::offsetUnset($offset);
        $this->exchangeArray(array_values($this->getArrayCopy()));
    }
    //repeat for every other function altering the values.
}

Другим вариантом будет SplDoublyLinkedList:

<?php
$u = new SplDoublyLinkedList();
$array = array('1' => 'one',
               '2' => 'two',
               '3' => 'three');
foreach($array as $value) $u[] = $value;
var_dump($u);
unset($u[1]);        
var_dump($u);
$u[] = 'another thing';
var_dump($u);
0 голосов
/ 02 сентября 2010

Это отчасти хром, но вы можете привести его к стандартному массиву и использовать для него array_splice:

$ao = new ArrayObject();
$ao[] = 'element 1';
$ao[] = 'element 2';
$ao[] = 'element 3';
$ao[] = 'element 4';

var_dump($ao);

$items = (array) $ao;
array_splice($items, 1, 2);
$ao = new ArrayObject($items);
$ao[] = 'element 5';

var_dump($ao);

В результате:

0 голосов
/ 02 сентября 2010

Почему бы не использовать offsetSet :

$ao = new ArrayObject();
$ao[] = 'a1';  // [0] => a1
$ao[] = 'a2';  // [1] => a2
$ao->offsetUnset(1);
$ao->offsetSet(1, 'a3');
...