質問

二つのアイテムでシンプルな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;
}
役に立ちましたか?

解決

あなたのコメントに質問の拡大に伴い:あなたはこの動作の種類を取得するために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);

他のヒント

なぜ使用 offsetSetといったのます:

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

このラメのようなものですが、あなたはそれに標準配列と使用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);

この結果でます:

object(ArrayObject)#1 (1) {
  ["storage":"ArrayObject":private]=>
  array(4) {
    [0]=>
    string(9) "element 1"
    [1]=>
    string(9) "element 2"
    [2]=>
    string(9) "element 3"
    [3]=>
    string(9) "element 4"
  }
}
object(ArrayObject)#2 (1) {
  ["storage":"ArrayObject":private]=>
  array(3) {
    [0]=>
    string(9) "element 1"
    [1]=>
    string(9) "element 4"
    [2]=>
    string(9) "element 5"
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top