5

如标题所述,您如何array_unshift()在 a 上执行 an arrayObjectarray_push()是通过执行 an 获得的,arrayObject->append()但是 unshift 呢?

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

4

5 回答 5

9

ArrayObject的API没有任何函数可以直接完成此操作。您还有其他几种选择:

  • 手动将每个元素移动 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);
于 2011-07-29T15:14:20.673 回答
5

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

class ExtendedArrayObject extends ArrayObject {
    public function prepend($value) {
        $array = (array)$this;
        array_unshift($array, $value);
        $this->exchangeArray($array);
    }
}
于 2011-07-29T15:16:38.130 回答
2
function prefix($value) {
    return $this->exchangeArray(array_merge([$value], $this->getArrayCopy()));
}
于 2013-06-16T19:43:41.643 回答
1

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

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

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

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 中也可以使用的方法,我仍然很感兴趣。

于 2011-07-29T15:45:50.853 回答
0

这对我有用。与array_merge()

    $old_arr[]=array(
        'val1'=>'sample1',
        'val2'=>'1'
    );

    $new_arr[] = array(
        'val1'=>'sample2',
        'val2'=>'2'
    );

    array_merge($new_arr,$old_arr);
于 2022-01-14T05:01:10.787 回答