PHP如何在arrayObject上使用array_unshift

时间:2011-07-29 15:00:58

标签: php spl arrayobject

正如标题中所述,如何对array_unshift()执行arrayObjectarray_push()是通过执行arrayObject->append()获得的,但是取消替换呢?

编辑:我忘了提到的是,在这种特殊情况下我还需要保留现有密钥。

4 个答案:

答案 0 :(得分:7)

API of ArrayObject没有任何直接完成此功能的功能。您还有其他几个选择:

  • 手动将每个元素移动1,并将新值设置为索引0(仅当您具有数字索引ArrayObject时)。
 $tmp = NULL;
 for ($i = 0; $arrayObject->offsetExists($i + 1); $i++) {
      $tmp = $arrayObject->offsetGet($i + 1);
      $arrayObject->offsetSet($i + 1, $arrayObject->offsetGet($i));
 }
 $arrayObject->offsetSet($i, $tmp);
 $arrayObject->offsetSet(0, $new_value);
  • 编写一个派生自ArrayObject的类并添加一个函数prepend(实现可能如下所示)。
  • 提取数组,调用array_unshift()并使用修改后的数组创建新的ArrayObject
 $array = $arrayObject->getArrayCopy();
 array_unshift($array, $new_value);
 $arrayObject->exchangeArray($array);

答案 1 :(得分:4)

ArrayObject中没有这样的功能,但您可以将其子类化以添加您需要的任何内容。试试这个:

class ExtendedArrayObject extends ArrayObject {
    public function prepend($value) {
        $array = (array)$this;
        array_unshift($array, $value);
        $this->exchangeArray($array);
    }
}

答案 2 :(得分:2)

function prefix($value) {
    return $this->exchangeArray(array_merge([$value], $this->getArrayCopy()));
}

答案 3 :(得分:1)

@dmitry,@ soulmerge你的答案对于最初的问题是好的,但在我的编辑中缺少了要求,但他们指出了我正确的方向来实现我所期望的这里我们在这里工作的解决方案:(适用于php> = 5.1)

public function unshift($value){
  $tmp = $this->getArrayCopy();
  $tmp = array($value) + $tmp;
  $this->exchangeArray($tmp);
  return $this;
}

这些例子与我们特定的arrayObject所需的最终解决方案并不完全相同。我们使用数组值中的给定键作为值的键(考虑使用数据库rowId作为集合中每个值的索引)。让我们将这个值称为“key”,这是实际的数组结构的样子:

array(
  key1 => array(key=>key1,val1=>val1,val2=>val2...),
  key2 => array(key=>key2,val1=>val1_2,val2=>val2_2...),
  ...
);

所以我们的解决方案看起来更像是这样:

public function unshift($value){
  $tmp = $this->getArrayCopy();
  $tmp = array($value['key'],$value) + $tmp;
  $this->exchangeArray($tmp);
  return $this;
}

谢谢你的答案,如果你找到一种在php5.0中工作的方式,我仍然感兴趣。