Alternativas a un array: SplFixedArray

Seguramente ya sabrás que un array «normal» de PHP ocupa una cantidad de memoria enorme.

El problema está relacionado con eso de que PHP es un lenguaje de tipado débil. Vamos, que una variable acepta cualquier tipo de dato. Da igual que contenga un entero, que un float, string, array… da igual.

Esta flexibilidad tiene unos costes: costes en memoria y en rendimiento.

Normalmente nos da un poco igual. Sí, lo confieso, a mí también en la mayoría de los casos.

Trabajar con arrays es comodísimo así que no nos complicamos la vida.

Pero hay ocasiones en las que tenemos limitaciones de memoria.

Y en esos casos viene muy bien tener a mano algo como SplFixedArray. No te asustes, es muy fácil de usar; se parece mucho a un array:

$a = new SplFixedArray(2);
$a[0] = 'A';
$a[1] = 'B';
print_r($a);

Las diferencias fundamentales con un array «normal»:

  • Tienes que darle un tamaño inicial (es el «2» que ves entre paréntesis).
  • Solo puedes usar números enteros como índices.

Los foreach funcionan igual:

$a = new SplFixedArray(2);
$a[0] = 'A';
$a[1] = 'B';
foreach ($a as $item) {
    echo $item . PHP_EOL;
}

Pero, ojo, si te pasas del tamaño tendrás un error. Este código no va a funcionar:

$a = new SplFixedArray(2);
$a[10] = 'N';

Pero puedes cambiar el tamaño:

$a = new SplFixedArray(2);
$a[0] = 'A';
$a[1] = 'B';

$a->setSize(10);
$a[5] = 'E';

Algo que puede que se sorprenda es el resultado de un foreach como éste:

$a = new SplFixedArray(5);
$a[0] = 'A';
$a[1] = 'B';
$a[3] = 'D';
foreach ($a as $indice => $item) {
echo "$indice: $item" . PHP_EOL;
}

El resultado será éste:

0: A
1: B
2:
3: D
4:

Sí, aunque no hayas definido un elemento ahí estará. Porque, recuerda, tiene una longitud fija.


¿Sabes lo que es el reto de PHP?

He creado el PHP Journey, una plataforma para que recibas de forma gratuita un email cada día con una pequeña perla de sabiduría de PHP y una pregunta que deberás responder.

Cada día pones a prueba tus conocimientos y aprendes algo nuevo.

Apúntate aquí:

https://urlantools.urlanheat.com/newsletter/php-journey/subscribe


Deja un comentario