PHP配列(ArrayObject)の内部ポインタ値をリセット
-
26-09-2019 - |
質問
二つのアイテムでシンプルな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"
}
}
所属していません StackOverflow