PHP SplFixedArray


Exemple

Différence avec PHP Array

Le type de tableau par défaut de PHP est implémenté en tant que cartes de hachage ordonnées, ce qui nous permet de créer des tableaux composés de paires clé / valeur, les valeurs pouvant être de tout type et les clés pouvant être des nombres ou des chaînes. Cependant, ce n’est pas traditionnellement la façon dont les tableaux sont créés.

Tableau PHP traditionnel Figure 1

Comme vous pouvez le voir sur cette illustration, un tableau PHP normal peut être considéré comme un ensemble ordonné de paires clé / valeur, chaque clé pouvant être mappée sur n'importe quelle valeur. Notez que dans ce tableau, nous avons des clés qui sont à la fois des nombres et des chaînes, ainsi que des valeurs de types différents et la clé n'a aucune incidence sur l'ordre des éléments.

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

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

Donc, le code ci-dessus nous donnerait exactement ce que nous attendions.

9 => foo
1 => 4.2
bar => 

Les baies PHP régulières sont également dimensionnées pour nous. Ils grandissent et rétrécissent au fur et à mesure que nous poussons et popons des valeurs vers et depuis le tableau, automatiquement.


Cependant, dans un tableau traditionnel, la taille est fixe et est entièrement du même type de valeur. De plus, plutôt que des clés, chaque valeur est accessible par son index, qui peut être déduit par son décalage dans le tableau.

SplFixedArray Figure 2

Puisque nous connaissons la taille d'un type donné et la taille fixe du tableau, un décalage est alors la type size * n du type size * n et n représente la position de la valeur dans le tableau. Donc, dans l'exemple ci-dessus, $arr[0] nous donne 1 , le premier élément du tableau et $arr[1] nous donne 2 , et ainsi de suite.

SplFixedArray, cependant, ne restreint pas le type de valeurs. Il restreint uniquement les clés aux types de nombres. C'est aussi d'une taille fixe.

Cela rend SplFixedArrays plus efficace que les baies PHP normales d'une manière particulière. Ils sont plus compacts et nécessitent moins de mémoire.

Instancier le tableau

SplFixedArray est implémenté en tant qu'objet, mais vous pouvez y accéder avec la même syntaxe familière que celle à laquelle vous accédez sur un tableau PHP normal, car ils implémentent l'interface ArrayAccess . Ils implémentent également les interfaces Countable et Iterator , de sorte qu'ils se comportent de la même façon que les tableaux se comportant en PHP (ex. count($arr) et foreach($arr as $k => $v) fonctionnent de la même façon pour SplFixedArray comme ils font des tableaux normaux en PHP.

Le constructeur SplFixedArray prend un argument, qui correspond à la taille du tableau.

$arr = new SplFixedArray(4);

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

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

Cela vous donne ce que vous attendez.

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

Cela fonctionne aussi comme prévu.

var_dump(count($arr));

Nous donne...

int(4)

Remarquez que dans SplFixedArray, contrairement à un tableau PHP normal, la clé représente l'ordre de l'élément dans notre tableau, car il s'agit d'un véritable index et non d'une simple carte .

Redimensionnement du tableau

Gardez à l'esprit que la taille du tableau étant fixe, count retournera toujours la même valeur. Donc, bien que unset($arr[1]) , $arr[1] === null , count($arr) reste 4 .

Donc, pour redimensionner le tableau, vous devrez appeler la méthode setSize .

$arr->setSize(3);

var_dump(count($arr));

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

Maintenant nous avons ...

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

Importer dans SplFixedArray et exporter depuis SplFixedArray

Vous pouvez également importer / exporter un tableau PHP normal dans et hors d'un SplFixedArray avec les méthodes fromArray et toArray .

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

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

Aller dans l'autre sens

$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