PHP
SPLデータ構造
サーチ…
SplFixedArray
PHP配列との違い
PHPのデフォルトのArray型は、実際には順序付けられたハッシュマップとして実装されています。この配列では、値が任意の型のキー/値のペアで構成され、キーは数値または文字列のいずれかになります。しかし、これは伝統的に配列の作成方法ではありません。
この図からわかるように、通常のPHP配列は、各キーが任意の値にマップできる、キーと値のペアの順序付けされたセットのように表示できます。この配列には、数字と文字列の両方のキーと異なる型の値があり、キーは要素の順序に関係しないことに注意してください。
$arr = [
9 => "foo",
1 => 4.2,
"bar" => null,
];
foreach($arr as $key => $value) {
echo "$key => $value\n";
}
だから、上記のコードは私たちが期待していたものを正確に与えるでしょう。
9 => foo 1 => 4.2 bar =>
通常のPHP配列も動的にサイズ調整されます。それらは自動的に値をプッシュして配列に/からポップすると、配列が拡大したり縮小したりします。
しかし、伝統的な配列では、サイズは固定されており、完全に同じタイプの値で構成されています。また、各値のキーではなく、そのインデックスによるアクセスです。これは、配列内のオフセットによって推測することができます。
与えられた型のサイズと配列の固定サイズを知るので、オフセットはtype size * n
であり、 n
は配列内の値の位置を表します。したがって、上記の例では、 $arr[0]
は1
$arr[1]
、配列の最初の要素と$arr[1]
は2
を$arr[1]
ます。
ただし、SplFixedArrayは値のタイプを制限しません。これは、キーを数値型に限定するだけです。固定サイズでもあります。
これにより、SplFixedArraysは通常のPHP配列よりも効率的になります。彼らはよりコンパクトなので、彼らはより少ないメモリを必要とします。
配列のインスタンス化
SplFixedArrayはオブジェクトとして実装されてArrayAccess
ますが、 ArrayAccess
インタフェースを実装しているので、通常のPHP配列にアクセスするのと同じような構文でアクセスできます。 Countable
インターフェースとIterator
インターフェースも実装しているので、PHPで動作する配列( count($arr)
やforeach($arr as $k => $v)
と同じように動作します。 SplFixedArrayはPHPで通常の配列を処理するため、
SplFixedArrayコンストラクタは、配列のサイズである1つの引数をとります。
$arr = new SplFixedArray(4);
$arr[0] = "foo";
$arr[1] = "bar";
$arr[2] = "baz";
foreach($arr as $key => $value) {
echo "$key => $value\n";
}
これは、あなたが期待するものをあなたに与えます。
0 => foo 1 => bar 2 => baz 3 =>
これは期待どおりに動作します。
var_dump(count($arr));
私たちに与える...
int(4)
SplFixedArrayでは、通常のPHP配列とは異なり、キーは配列内の要素の順序を表しています 。これはマップだけでなく真のインデックスでもあるためです。
配列のサイズ変更
配列は固定サイズなので、countは常に同じ値を返すことに注意してください。したがって、 unset($arr[1])
は$arr[1] === null
、 count($arr)
は4
ままです。
配列のサイズを変更するには、 setSize
メソッドを呼び出す必要があります。
$arr->setSize(3);
var_dump(count($arr));
foreach($arr as $key => $value) {
echo "$key => $value\n";
}
今、私たちは...
int(3) 0 => foo 1 => 2 => baz
SplFixedArrayへのインポートとSplFixedArrayからのエクスポート
fromArray
メソッドとtoArray
メソッドを使用して、通常のPHP配列をSplFixedArrayの内外にインポート/エクスポートすることもできます。
$array = [1,2,3,4,5];
$fixedArray = SplFixedArray::fromArray($array);
foreach($fixedArray as $value) {
echo $value, "\n";
}
1 2 3 4 5
反対に行く。
$fixedArray = new SplFixedArray(5);
$fixedArray[0] = 1;
$fixedArray[1] = 2;
$fixedArray[2] = 3;
$fixedArray[3] = 4;
$fixedArray[4] = 5;
$array = $fixedArray->toArray();
foreach($array as $value) {
echo $value, "\n";
}
1 2 3 4 5