Buscar..


SplFixedArray

Diferencia de PHP Array

El tipo de matriz predeterminado de PHP se implementa realmente como mapas hash ordenados, que nos permiten crear matrices que consisten en pares clave / valor donde los valores pueden ser de cualquier tipo y las claves pueden ser números o cadenas. Sin embargo, esto no es tradicionalmente cómo se crean los arreglos.

Figura 1 de la matriz PHP tradicional

Entonces, como puede ver en esta ilustración, una matriz PHP normal se puede ver más como un conjunto ordenado de pares clave / valor, donde cada clave se puede asignar a cualquier valor. Note que en esta matriz tenemos claves que son tanto números como cadenas, como valores de diferentes tipos y la clave no tiene relación con el orden de los elementos.

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

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

Así que el código anterior nos daría exactamente lo que esperaríamos.

9 => foo
1 => 4.2
bar => 

Las matrices regulares de PHP también tienen un tamaño dinámico para nosotros. Crecen y se encogen a medida que empujamos y hacemos estallar los valores desde y hacia la matriz, automáticamente.


Sin embargo, en una matriz tradicional, el tamaño es fijo y consiste completamente en el mismo tipo de valor. Además, en lugar de claves, cada valor es el acceso por su índice, que puede deducirse por su desplazamiento en la matriz.

SplFixedArray Figura 2

Como sabríamos el tamaño de un tipo dado y el tamaño fijo de la matriz, un desplazamiento es el type size * n n representa la posición del valor en la matriz. Entonces, en el ejemplo anterior, $arr[0] nos da 1 , el primer elemento de la matriz y $arr[1] nos da 2 , y así sucesivamente.

SplFixedArray, sin embargo, no restringe el tipo de valores. Sólo restringe las claves a los tipos de números. También es de un tamaño fijo.

Esto hace que SplFixedArrays sea más eficiente que los arreglos PHP normales de una manera particular. Son más compactos por lo que requieren menos memoria.

Creando la matriz

SplFixedArray se implementa como un objeto, pero se puede acceder con la misma sintaxis familiar a la que accede a una matriz PHP normal, ya que implementan la interfaz ArrayAccess . También implementan las interfaces Countable e Iterator para que se comporten de la misma manera que lo harías con las matrices que se comportan en PHP (es decir, cosas como count($arr) y foreach($arr as $k => $v) funcionan de la misma manera para SplFixedArray ya que hacen arreglos normales en PHP.

El constructor SplFixedArray toma un argumento, que es el tamaño de la matriz.

$arr = new SplFixedArray(4);

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

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

Esto te da lo que esperas.

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

Esto también funciona como se esperaba.

var_dump(count($arr));

Nos da...

int(4)

Note que en SplFixedArray, a diferencia de una matriz PHP normal, la clave representa el orden del elemento en nuestra matriz, porque es un índice verdadero y no solo un mapa .

Cambiar el tamaño de la matriz

Solo tenga en cuenta que debido a que la matriz es de un tamaño fijo, la cuenta siempre devolverá el mismo valor. Así que mientras unset($arr[1]) dará como resultado $arr[1] === null , la count($arr) aún permanece en 4 .

Por lo tanto, para cambiar el tamaño de la matriz, deberá llamar al método setSize .

$arr->setSize(3);

var_dump(count($arr));

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

Ahora tenemos ...

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

Importar a SplFixedArray y exportar desde SplFixedArray

También puede importar / exportar una matriz PHP normal dentro y fuera de un SplFixedArray con los métodos fromArray y toArray .

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

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

Yendo por el otro lado.

$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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow