📦 Array e suas formas de compactar e descompactar no PHP

Uma parte fundamental das linguagens de programação é a possibilidade de agrupar dados em listas, sendo que cada linguagem tem suas variações de como fazer.

PHP tem uma grande flexibilidade para os construir, pois além de ser uma linguagem fracamente tipada ainda permite a utilização de string (texto) como chave, e a possibilidade de criar arrays numéricos não sequenciais, pôs seu array é considerado um array associativo. Isso agrega vantagens como, para um dado tanto sua chave quanto sua posição podem ser usados como atributos do dado, e sua chave pode ser construída de forma a armazenar mais do que somente uma referência para o dados mas ela mesmo pode ser uma dado também. Para uma explicação mais detalhada confira a documentação do array.

Quando utilizam array muitas vezes precisamos compactá-los, isto é, precisamos transformar o array que é um grupo de dados em uma dado só, para podermos, por exemplo, guardar ele em um banco de dados ou transmiti-lo para outro lugar, como quando temos que mandar uma array php para o javascript que usa um padrão diferente de estrutura.

Para tanto temos métodos diferentes que apresentam vantagens e desvantagens, e este artigo tem por objetivo mostrar alguns métodos que o php nos apresenta.

Implode e explode

$array = array(
	'nome' => 'João',
	'Idade' => 25,
	'proficao' => 'Programador',
);

$string = implode(',' , $array);
echo $string;

Saída:

João,25,Programador

Modo simples de compactação, pega os valores de uma array e os agrupa com um separador que no caso é uma "," (vírgula). Entretanto não aceita array multidimensionais. exp.:

$array = array(
    'nome' => 'João',
    'Idade' => 25,
    'proficao' => 'Programador',
    'endereco' => array(
        'logradouro' => 'Av. Paulista,',
        'numero' => '1543',
        'bairro' => 'Bela Vista',
        'cidade' => 'São Paulo',
        'estado' => 'SP',
        'cep' => '01311-200',
    ),
);

$string = implode(',' , $array);
echo $string;

Saida:

João,25,Programador,Array

Ainda irá disparar uma notificação avisando que uma array está sendo convertido para string.

Para descompactar é simples basta passar usar o caractere que foi usado na compactação junto com a string de saída.

$string = 'João,25,Programador';
$array = explode(',', $string);
print_r($array);

Saída:

Array
(
    [0] => João
    [1] => 25
    [2] => Programador
)

OBS.: lembre caso o caractere de compactação estiver inserido em algum valor da string, o explode irá retornar um array não esperado.

Vantagens

  • Resultado simples e fácil de entender;
  • Muitas possibilidade de uso;
  • Utilização simples sem muita variação;

Desvantagens

  • A compactação não aceita todas as variações do array;
  • A descompactação pode gerar um array diferente do array original;
  • Não mantém a relação chaves valor do array;

Documentação Original

Json

$array = array(
    'nome' => 'João',
    'idade' => 25,
    'proficao' => 'Programador',
    'endereco' => array(
        'logradouro' => 'Av. Paulista,',
        'numero' => '1543',
        'bairro' => 'Bela Vista',
        'cidade' => 'São Paulo',
        'estado' => 'SP',
        'cep' => '01311-200',
    ),
);

$string = json_encode($array);
echo $string;

Saída:

{"nome":"Jo\u00e3o","idade":25,"proficao":"Programador","endereco":{"logradouro":"Av. Paulista,","numero":"1543","bairro":"Bela Vista","cidade":"S\u00e3o Paulo","estado":"SP","cep":"01311-200"}}

json_encode tem uma saída relativamente simples e fácil de entender, mantém as chaves do array e não necessita de um separador pôs usa um padrão para sua compactação.

$string = '{"nome":"Jo\u00e3o","idade":25,"proficao":"Programador","endereco":{"logradouro":"Av. Paulista,","numero":"1543","bairro":"Bela Vista","cidade":"S\u00e3o Paulo","estado":"SP","cep":"01311-200"}}';
$array = json_decode($string);
print_r($array);

Saída:

stdClass Object
(
    [nome] => João
    [idade] => 25
    [proficao] => Programador
    [endereco] => stdClass Object
        (
            [logradouro] => Av. Paulista,
            [numero] => 1543
            [bairro] => Bela Vista
            [cidade] => São Paulo
            [estado] => SP
            [cep] => 01311-200
        )

)

Retorna a mesma estrutura do array original mas não retorna exatamente um array, retorna stdClass pôs no json os array associativos são objetos, entretanto, json_decode contém constantes que permitem, entre outras coisa, configurar para json_decode exporta array no lugar de stdClass.

Vantagens

  • Principal uso é servir como um modo de transferir informações para o javascript e criar arquivos de configuração;
  • Estrutura razoavelmente simples, facilitando o entendimento;
  • Mantém a relação de chave e valor do array;

Desvantagens

  • Função nova, sua melhor utilização é a partir do php 5.4 mesmo sendo criada no php 5.2;
  • A função é compatível com charset UTF-8, não funcionando corretamente para outros tipos de charset;

Documentação

Serialize e Unserialize

$array = array(
    'nome' => 'João',
    'idade' => 25,
    'proficao' => 'Programador',
    'endereco' => array(
        'logradouro' => 'Av. Paulista,',
        'numero' => '1543',
        'bairro' => 'Bela Vista',
        'cidade' => 'São Paulo',
        'estado' => 'SP',
        'cep' => '01311-200',
    ),
);

$string = serialize($array);
echo $string;

Saída:

a:4:{s:4:"nome";s:5:"João";s:5:"idade";i:25;s:8:"proficao";s:11:"Programador";s:8:"endereco";a:6:{s:10:"logradouro";s:13:"Av. Paulista,";s:6:"numero";s:4:"1543";s:6:"bairro";s:10:"Bela Vista";s:6:"cidade";s:10:"São Paulo";s:6:"estado";s:2:"SP";s:3:"cep";s:9:"01311-200";}}

Serialize tem uma saída um tanto complexa mas compensa pois mantém as chaves e o tipo dos valores imputados inclusive se a entrada for um objeto do sistema ou um criado pelo programador.

$string = 'a:4:{s:4:"nome";s:5:"João";s:5:"idade";i:25;s:8:"proficao";s:11:"Programador";s:8:"endereco";a:6:{s:10:"logradouro";s:13:"Av. Paulista,";s:6:"numero";s:4:"1543";s:6:"bairro";s:10:"Bela Vista";s:6:"cidade";s:10:"São Paulo";s:6:"estado";s:2:"SP";s:3:"cep";s:9:"01311-200";}}';
$array = unserialize($string);
print_r($array);

Saída:

Array
(
    [nome] => João
    [idade] => 25
    [proficao] => Programador
    [endereco] => Array
        (
            [logradouro] => Av. Paulista,
            [numero] => 1543
            [bairro] => Bela Vista
            [cidade] => São Paulo
            [estado] => SP
            [cep] => 01311-200
        )

)

Podemos ver que a saída foi um array do mesmo tipo imputado no serialize.

Vantagens

  • Compactação fortemente controlada garantindo que o mesmo que foi compactado será recuperado na descompactação;
  • Principais usos: transferir dados dentro do php, persistir informações de seção, guardar no banco de dados.
  • Mantém relação chave valor do array;
  • Consegue lidar até com objetos;

Desvantagens

  • Compactação bem complexa, sendo bem trabalhoso sua interpretação, consulta ou edição manual;

Documentação

var_export e eval

$array = array(
    'nome' => 'João',
    'idade' => 25,
    'proficao' => 'Programador',
    'endereco' => array(
        'logradouro' => 'Av. Paulista,',
        'numero' => '1543',
        'bairro' => 'Bela Vista',
        'cidade' => 'São Paulo',
        'estado' => 'SP',
        'cep' => '01311-200',
    ),
);

$string = var_export($array, true);
echo $string;

Saida:

array (
  'nome' => 'João',
  'idade' => 25,
  'proficao' => 'Programador',
  'endereco' => 
  array (
    'logradouro' => 'Av. Paulista,',
    'numero' => '1543',
    'bairro' => 'Bela Vista',
    'cidade' => 'São Paulo',
    'estado' => 'SP',
    'cep' => '01311-200',
  ),
)

Mesmo sendo na verdade uma função de depuração de variáveis podemos usar ela para compactar o array e por exemplo armazenar em um banco de dados, ou transmitir se a requisição espera um dado que será interpretado por php.

$array = eval("return array (
  'nome' => 'João',
  'idade' => 25,
  'proficao' => 'Programador',
  'endereco' => 
  array (
    'logradouro' => 'Av. Paulista,',
    'numero' => '1543',
    'bairro' => 'Bela Vista',
    'cidade' => 'São Paulo',
    'estado' => 'SP',
    'cep' => '01311-200',
  ),
);
");

print_r($array);

Saida:

Array
(
    [nome] => João
    [idade] => 25
    [proficao] => Programador
    [endereco] => Array
        (
            [logradouro] => Av. Paulista,
            [numero] => 1543
            [bairro] => Bela Vista
            [cidade] => São Paulo
            [estado] => SP
            [cep] => 01311-200
        )

)

É importante notar que para converter corretamente a string compactada no eval temos que completar com return e ; como no exemplo nas linhas 1 e 14 respectivamente.

OBS.: var_dump e print_r também são funções de depuração mas seus resultados não tem um descompactador.

Vantagens

  • Principal uso é como depurador de variáveis;
  • Estrutura razoavelmente simples, facilitando o entendimento;
  • Mantém a relação de chave e valor do array;

Desvantagens

  • Métodos não muito tradicionais para o uso;
  • eval pode ser uma brecha de segurança em seu sistema pois é uma porta para php injection;

Documentação

http_build_query e parse_str

$array = array(
    'nome' => 'João',
    'idade' => 25,
    'proficao' => 'Programador',
    'endereco' => array(
        'logradouro' => 'Av. Paulista,',
        'numero' => '1543',
        'bairro' => 'Bela Vista',
        'cidade' => 'São Paulo',
        'estado' => 'SP',
        'cep' => '01311-200',
    ),
);

$string = http_build_query($array);
echo $string;

Saída:

nome=Jo%C3%A3o&idade=25&proficao=Programador&endereco%5Blogradouro%5D=Av.+Paulista%2C&endereco%5Bnumero%5D=1543&endereco%5Bbairro%5D=Bela+Vista&endereco%5Bcidade%5D=S%C3%A3o+Paulo&endereco%5Bestado%5D=SP&endereco%5Bcep%5D=01311-200

Esse método tem por principal uso a confecção de urls para usar em um link no html ou um redirecionamento interno no php.

parse_str("nome=Jo%C3%A3o&idade=25&proficao=Programador&endereco%5Blogradouro%5D=Av.+Paulista%2C&endereco%5Bnumero%5D=1543&endereco%5Bbairro%5D=Bela+Vista&endereco%5Bcidade%5D=S%C3%A3o+Paulo&endereco%5Bestado%5D=SP&endereco%5Bcep%5D=01311-200", $array);

print_r($array);

Saída:

Array
(
    [nome] => João
    [idade] => 25
    [proficao] => Programador
    [endereco] => Array
        (
            [logradouro] => Av. Paulista,
            [numero] => 1543
            [bairro] => Bela Vista
            [cidade] => São Paulo
            [estado] => SP
            [cep] => 01311-200
        )

)

Vantagens

  • Principal uso e para construir urls para links do html ou redirects internos do php;
  • Mantém a relação de chave e valor do array;
  • corrigir possíveis erros de caracteres em url.

Desvantagens

  • Método não muito tradicionais para o uso;
  • Sua compactação é um pouco complexa tornando mais difícil de interpretar;

Documentação

Conclusão

Este artigo apresentou algumas formas de compactação e descompactação de arrays em php algumas mais tradicionais e outras não muito, provavelmente existe mais, tentei mostrar alternativas que muitos podem nem saber que poderiam ser usadas com esta finalidade ou que existiam.

Não posso apontar uma melhor, porque, mesmo a que tem mais desvantagens tem seu uso bem variado, e usando da criatividade é possível descobrir muitos usos para ela.

E como sempre falo, nunca pense em qual será a melhor, mas sim conheça suas opções e quando é a hora correta de usar uma ou outra.

Agora eu quero saber, aprenderam algo novo hoje? conhecem mais alguma forma de compactar e descompactar arrays? Comente ai!!! 👍

Excelente Artigo, com uma boa explicação e exemplos práticos com os retornos esperados, parabéns!!

Obrigado @emmanuelpcg. Esse artigo já tenho guardado a muito tempo (anos) e hoje temos um ótimo lugar para tirar da gaveta o que sempre queriamos escrever.