Szukaj…


SplFixedArray

Różnica w stosunku do tablicy PHP

Domyślny typ tablicy PHP jest faktycznie implementowany jako uporządkowane mapy skrótów, które pozwalają nam tworzyć tablice składające się z par klucz / wartość, w których wartości mogą być dowolnego typu, a klucze mogą być liczbami lub łańcuchami. Jednak nie jest to tradycyjnie sposób tworzenia tablic.

Tradycyjna tablica PHP Rysunek 1

Jak widać na tej ilustracji, normalną tablicę PHP można oglądać bardziej jak uporządkowany zestaw par klucz / wartość, gdzie każdy klucz może być odwzorowany na dowolną wartość. Zauważ, że w tej tablicy mamy klucze, które są zarówno liczbami, jak i łańcuchami, a także wartości różnych typów, a klucz nie ma wpływu na kolejność elementów.

$arr = [
    9     => "foo",
    1     => 4.2,
    "bar" => null,
];

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Powyższy kod dałby nam dokładnie to, czego się spodziewalibyśmy.

9 => foo
1 => 4.2
bar => 

Zwykłe tablice PHP są również dla nas dynamicznie zmieniane. Rosną i kurczą się, gdy automatycznie wypychamy i pop wartości do tablicy.


Jednak w tradycyjnej tablicy rozmiar jest stały i składa się całkowicie z tego samego rodzaju wartości. Ponadto zamiast kluczy każda wartość ma dostęp według indeksu, który można wywnioskować na podstawie przesunięcia w tablicy.

SplFixedArray Rysunek 2

Ponieważ znalibyśmy rozmiar danego typu i stały rozmiar tablicy, przesunięcie jest wtedy type size * n , gdzie n reprezentuje pozycję wartości w tablicy. W powyższym przykładzie $arr[0] daje nam 1 , pierwszy element w tablicy, a $arr[1] daje nam 2 i tak dalej.

SplFixedArray nie ogranicza jednak typu wartości. Ogranicza tylko klucze do typów liczb. Ma również stały rozmiar.

To sprawia, że SplFixedArrays jest bardziej wydajny niż zwykłe tablice PHP w jeden szczególny sposób. Są bardziej kompaktowe, więc wymagają mniej pamięci.

Tworzenie instancji tablicy

SplFixedArray jest zaimplementowany jako obiekt, ale można uzyskać do niego dostęp przy użyciu tej samej znanej składni, co dostęp do normalnej tablicy PHP, ponieważ implementują one interfejs ArrayAccess . Implementują również interfejsy Countable i Iterator , dzięki czemu zachowują się w taki sam sposób, jak przyzwyczajenie się do tablic w PHP (tj. Takie jak count($arr) i foreach($arr as $k => $v) działają w ten sam sposób dla SplFixedArray, podobnie jak normalne tablice w PHP.

Konstruktor SplFixedArray pobiera jeden argument, który jest rozmiarem tablicy.

$arr = new SplFixedArray(4);

$arr[0] = "foo";
$arr[1] = "bar";
$arr[2] = "baz";

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

To daje ci to, czego możesz oczekiwać.

0 => foo
1 => bar
2 => baz
3 => 

Działa to również zgodnie z oczekiwaniami.

var_dump(count($arr));

Daje nam...

int(4)

Uwaga w SplFixedArray, w przeciwieństwie do normalnej tablicy PHP, klucz przedstawia kolejność elementu w naszej tablicy, ponieważ jest to prawdziwy indeks, a nie tylko mapa .

Zmiana rozmiaru tablicy

Pamiętaj tylko, że ponieważ tablica ma stały rozmiar, liczba zawsze zwróci tę samą wartość. Więc chociaż unset($arr[1]) spowoduje, że $arr[1] === null , count($arr) nadal pozostaje 4 .

Aby zmienić rozmiar tablicy, musisz wywołać metodę setSize .

$arr->setSize(3);

var_dump(count($arr));

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Teraz otrzymujemy ...

int(3)
0 => foo
1 => 
2 => baz

Importuj do SplFixedArray i eksportuj z SplFixedArray

Możesz także importować / eksportować normalną tablicę PHP do iz SplFixedArray za pomocą metod fromArray i toArray .

$array      = [1,2,3,4,5];
$fixedArray = SplFixedArray::fromArray($array);

foreach($fixedArray as $value) {
    echo $value, "\n";
}
1
2
3
4
5

Idąc w drugą stronę.

$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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow