Looking for php Keywords? Try Ask4Keywords

PHP SplFixedArray


PHP配列との違い

PHPのデフォルトのArray型は、実際には順序付けられたハッシュマップとして実装されています。この配列では、値が任意の型のキー/値のペアで構成され、キーは数値または文字列のいずれかになります。しかし、これは伝統的に配列の作成方法ではありません。

従来のPHP配列図1

この図からわかるように、通常の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配列も動的にサイズ調整されます。それらは自動的に値をプッシュして配列に/からポップすると、配列が拡大したり縮小したりします。


しかし、伝統的な配列では、サイズは固定されており、完全に同じタイプの値で構成されています。また、各値のキーではなく、そのインデックスによるアクセスです。これは、配列内のオフセットによって推測することができます。

SplFixedArray図2

与えられた型のサイズと配列の固定サイズを知るので、オフセットは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] === nullcount($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