5

array_unshift()タイトルで述べたように、 on aarrayObjectを実行array_push()するにはどうすればよいですarrayObject->append()か?

編集:私が言及するのを忘れていたのは、この特定のケースでは既存のキーを保持する必要があるということです。

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あなたの答えは最初の質問に関しては良かったのですが、私の編集では要件が欠けていましたが、私が期待していたことを達成するために正しい方向に私を向けてくれました。 >=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 に答える