重置PHP数组(ArrayObject)的内部指针值

重置PHP数组(ArrayObject)的内部指针值,php,arrays,arrayobject,Php,Arrays,Arrayobject,考虑一个包含两项的简单PHP ArrayObject $ao = new ArrayObject(); $ao[] = 'a1'; // [0] => a1 $ao[] = 'a2'; // [1] => a2 然后删除最后一项并添加新项 $ao->offsetUnset(1); $ao[] = 'a3'; // [2] => a3 我非常希望能够有“a3”be[1] 在添加“a3”之前,如何重置内部指针值 我有一个简单的函数可以实现这一点,但如果不需要的话,我

考虑一个包含两项的简单PHP ArrayObject

$ao = new ArrayObject();
$ao[] = 'a1';  // [0] => a1
$ao[] = 'a2';  // [1] => a2
然后删除最后一项并添加新项

$ao->offsetUnset(1);
$ao[] = 'a3';  // [2] => a3
我非常希望能够有“a3”be[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);

这有点蹩脚,但您可以将其转换为标准阵列并在其上使用阵列拼接:

$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"
  }
}

说得好。我的问题遗漏了几个非常重要的细节。谢谢。我觉得我的例子只是我遇到的几个用例场景中的一个。为了回答这个问题,我将保持原样,但同时添加。。。如果要删除的数组元素不是最后一个元素,则需要在重置内部指针之前进行折叠。是否可以有一个包含四个元素([0]、[1]、[2]和[3])的数组,删除[1]和[2],并重置指针,以便下一个要添加的元素得到[2]?这仍然是今天的最佳答案吗?我也有同样的问题,我担心$this->exchangeArray(array_values(…)行的性能影响。最好的答案是不关心您的键是多少。首先想一想:你为什么需要OP需要的东西?我必须循环遍历ArrayObject的成员并删除一些。为了避免这种情况,我从最高点到最低点进行了假设。但是同意:不需要知道密钥是正确的解决方案,我已经使用getArrayCopy()重写了代码
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"
  }
}