PHP如何在arrayObject上使用array_unshift

mal*_*lko 4 php spl arrayobject

正如标题所说,你如何执行array_unshift()arrayObject,array_push()由做一个获得arrayObject->append()但对于不印字?

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

sou*_*rge 7

ArrayObjectAPI没有任何直接完成此任务的功能.您还有其他几种选择:

  • 手动将每个元素移动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);
Run Code Online (Sandbox Code Playgroud)
  • 编写一个派生自ArrayObject并添加函数的类prepend(实现可以是下面的实现).
  • 提取数组,调用array_unshift()ArrayObject使用修改后的数组创建一个新数组:
 $array = $arrayObject->getArrayCopy();
 array_unshift($array, $new_value);
 $arrayObject->exchangeArray($array);
Run Code Online (Sandbox Code Playgroud)


laz*_*mer 6

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

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


mal*_*lko 1

@Dmitry,@soulmerge 对于最初的问题,您的答案很好,但缺少我编辑中的要求,但它们为我指明了正确的方向,以实现我的预期,这是我们在工作中提供的解决方案:(适用于 php >=5.1)

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

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

array(
  key1 => array(key=>key1,val1=>val1,val2=>val2...),
  key2 => array(key=>key2,val1=>val1_2,val2=>val2_2...),
  ...
);
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的回答,如果您找到一种适用于 php5.0 的方法,我仍然感兴趣。