Array com tamanho fixo no PHP (SplFixedArray)

Artigo que apresenta a classe SplFixedArray do PHP, que permite manipular um array com performance melhorada.

PHP oferece nativamente o tipo array, que possui bastante flexibilidade. As principais características do array de PHP é que ele permite índices inteiros ou alfanuméricos, e é auto-redimensionável, ou seja, cresce ou diminui conforme elementos são adicionados ou removidos.

Quem já trabalhou com linguagens mais baixo nível, como C ou C++, deve saber que manter o controle sobre um array auto-redimensionável implica em perda de performance em função da realocação de memória. Para prover uma solução mais restrita e mais rápida para PHP, foi criada a classe SplFixedArray, disponível a partir da versão 5.3 de PHP. Ela só aceita inteiros como índices (de zero até o tamanho menos um) e tem tamanho fixo (definido na criação do objeto), embora possa ser redimensionado a qualquer momento. Quanto menos redimensionamento é feito, mais ela tende a ser mais rápida que um array convencional.

Embora seja uma classe, a SplFixedArray tem capacidade de funcionar (sintaticamente) de forma parecida com um array convencional, pois implementa as interfaces Iterator, ArrayAccess e Countable. Porém, seus recursos também podem ser invocados através da chamada de seus métodos.

Exemplo de uso:

// Cria o array de tamanho 10, com todas posicoes valendo NULL
$array = new SplFixedArray(10);

// Definindo o valor da posicao 0 (primeira posicao)
$array[0] = 'Rubens';

// Definindo o valor da posicao 9 (ultima posicao) atraves de metodo
$array->offsetSet(9, 'Teste');

// Tentando definir o valor de uma posicao invalida (gera-se excecao)
try {
    $array[10] = 'Eita';
} catch (RuntimeException $e) {
    echo $e->getMessage();
}

// Obtendo o valor da posicao 0
$x = $array[0];

// Obtendo o valor da posicao 9 atraves de metodo
$y = $array->offsetGet(9);

// Checando se a posicao 1 foi definida (eh diferente de NULL)
$existe = isset($array[1]);

// Checando se a posicao 1 foi definida utilizando metodo
$existe = $array->offsetExists(1);

// Obtendo o tamanho do array (10)
$tamanho = count($array);

// Obtendo o tamanho do array atraves de metodo
$tamanho = $array->count();

// Outra forma de obter o tamanho do array com outro metodo
$capacidade = $array->getSize();

// Percorrendo o array com foreach
foreach ($array as $indice => valor) {
    echo $indice.' = '.$valor.PHP_EOL;
}

// Redimensionando o array
$array->setSize(20);

// Obtendo o array correspondente a forma convencional
$array_convencional = $array->toArray();

6 comentários

Anônimo disse...

Olá, a função SplFixedArray funcionou na máquina local e não funciona em meu servidor php na uolhost. Qual poderá ser o problema?

Rubens Takiguti Ribeiro (autor do blog) disse...

Olá, Anônimo

Verifique os seguintes itens:
* se está usando PHP 5.3 ou superior: var_dump(PHP_VERSION);
* se possui a extensão SPL instalada: var_dump(extension_loaded('spl'));
* se a spl possui a classe: var_dump(class_exists('SplFixedArray'));

Sérgio Mauro disse...

Rubens, Verifiquei nas configurações do servidor na UOLHOST e a versão do PHP é a 5.2. Isso impossibilita a utilização da função em meus sistemas ou tem como lidar com essa diferênça.

Sérgio Mauro disse...

Rubens, Nas configurações avançadas do servidor eu pude alterar a versão para 5.3 e agora já está funcionando. Muito obrigado pela contribuição.