array_unshift()
タイトルで述べたように、 on aarrayObject
を実行array_push()
するにはどうすればよいですarrayObject->append()
か?
編集:私が言及するのを忘れていたのは、この特定のケースでは既存のキーを保持する必要があるということです。
array_unshift()
タイトルで述べたように、 on aarrayObject
を実行array_push()
するにはどうすればよいですarrayObject->append()
か?
編集:私が言及するのを忘れていたのは、この特定のケースでは既存のキーを保持する必要があるということです。
ArrayObjectのAPI には、これを直接行う関数はありません。他にもいくつかのオプションがあります。
$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);
ArrayObject にはそのような機能はありませんが、サブクラス化して必要なものを追加できます。これを試して:
class ExtendedArrayObject extends ArrayObject {
public function prepend($value) {
$array = (array)$this;
array_unshift($array, $value);
$this->exchangeArray($array);
}
}
function prefix($value) {
return $this->exchangeArray(array_merge([$value], $this->getArrayCopy()));
}
@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でも機能する方法を見つけたら、私はまだ興味があります.