Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Juninho De Luca_54619

Best way ao salvar array multidimensional E associativo

Recommended Posts

Olá pessoal,

Estou com uma dúvida, mais da ordem de "best way" do que de "how to do".

Digamos que eu tenha um formulario com os campos:

[ID]--[COD-PAI]--[GRUPO]--[DESCRICAO]--[PRECO]
[01]--[1234567]--[GRUPO]--[Teste 01 ]--[1,11] <-- // Exemplo de preenchimento
[02]--[0987654]--[GRUPO]--[Teste 02 ]--[2,22]
[03]--[1111111]--[GRUPO]--[Teste 03 ]--[3,33]
(...)
Ali no campo GRUPO, coloquei um botão, que abre uma pop window (ou poderia ser uma div, o qualquer coisa que satisfizesse isso), com outro sub-formulario:
[ID]---[COD-FILHO]---[PRECO-DIFERENTE]
[01]---[1234567  ]---[1,13] <-- // Exemplo de preenchimento
[02]---[0987654  ]---[2,24]
[03]---[11111111 ]---[3,37]
(...)
No MySQL, hoje tenho duas tabelas diferentes. Mas pretendo fazer tudo em uma só.

Pensei em encapsular em um array multidimensional associativo.

Algo tipo:

$grupo = [
"1" => ["1234567" => "1,13" ], 
"2" => ["0987654" => "2,24" ],
"3" => ["1111111" => "3,37" ]
];
Perdoe-me se a sintaxe não está perfeita. Não é essa a questão.

Beleza. Consigo acessar com:

echo $grupo[1]["1234567"] // vai retornar "1,13"
echo $grupo[2]["0987654"] // vai retornar "2,24"
echo $grupo[3]["1111111"] // vai retornar "3,37"
O ponto é... como armazeno esse array inteiro dentro de um único campo do MySQL?

Faço como uma string, escapando esses brakets? Me pareceu perigoso.

Uma outra possibilidade que imaiginei foi armazenar como uma espécie de CSV, separando por vígulas, e criar uma função parser e outra para montar o array externo.

Alguma sugestão?

 

Abraçoooo

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc só pode chamar de "Desafio" se vc mesmo souber como resolver.

 

Editei o título.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hahaha foi mal Bruno. Me desculpe.

Raoni... então... mas como uso o serialize em um array multidimensional E associativo?

Costumo usar ou com multidimensionais ou com associativos, não com os dois juntos =(



Opa!

Lendo mais uma vez o php.net sobre o serialize(), percebi que ele serializa todos os tipos de objetos e estrutura.

Parece que vc me deu a chave Raoni! Vou testar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já li isso também... no meu caso a diferença de velocidade seria tão mínima que não valeria a pena mudar a estrutura de tantos controladores nesse momento. E na verdade foi comparando ao json_encode() que percebi que o serialize() que o Raoni sugeriu poderia mesmo funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na minha opinião o que você deveria realmente fazer era modelar seu banco de dados para não precisar enfiar tudo isso num único campo.

 

A primeira vista pode até parecer interessante e até mesmo fácil manipular todos esses dados como um array mas com o tempo você vai começar a sentir ou dificuldade ou perda de performance, porque trabalhar com arrays muito grandes não é legal, seja porque arrays são do mal, seja por precisar reestruturar os dados, exigindo iterar e executar rotinas cabeludas que uma JOIN resolveria com o pé nas costas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre a questão do banco, hoje já armazeno em uma tabela separada.

Como cada grupo terá de 0 a 26 keys => values, me pareceu uma ideia melhor que manter uma tabela separada,

que preciso ficar dividindo atenção.

Algo importante, que talvez faça diferença é que não é um número ilimitado de dados.

O número máximo de associações keys => values por ano será de 209.560, mas pelo histórico de três anos,

não chega a 10% disso. Ao final de cada ano esses valores são "dumpados" em um arquivo .sql e a tabela é truncada.

 

E porque você acha que arrays são do mal?

Levei um put* tempo até aprender melhor trabalhar com arrays de forma tranquila hauhauhau

Ainda acho arrays associativos a melhor forma de passar parametros para functions nas classes.

Ou não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Arrays muito grandes são do mal. Os pequenos são um mal necessário, não chega a atrapalhar.

 

O ponto é que se você puder deixar o banco fazer as coisas por você melhor. Quanto menos laços, rotinas complexas´ou mesmo recriação da própria matriz que você precisar fazer, se o array for muito grande, o consumo de memória pode ficar bem alto.

 

Dá uma olhada nesse artigo pra você ver. Está em inglês, como tudo de bom que na Web, e tem uma parte que fala sobre o o porquê que pode ser um pouco confusa pois envolve a linguagem C, mas ainda assim, vale a leitura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Podem marcar como resolvido, peeps.

A função serialize() foi a resposta pra minha necessidade.

O debate continuou em função do tamanho de memória dos arrays.

A título de curiosidade, fiz a seguinte experiência, usando o artigo que o Bruno indicou:

 

 

$teste = memory_get_usage();

$code_sec = [
    ['1111111' => '1.11'],
    ['2222222' => '1.11'],
    ['3333333' => '1.11'],
    ['4444444' => '1.11'],
    ['5555555' => '1.11'],
    ['6666666' => '1.11'],
    ['7777777' => '1.11'],
    ['8888888' => '1.11'],
    ['9999999' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11'],
    ['1111111' => '1.11']
];

serialize($code_sec);
echo memory_get_usage() - $teste . " bytes";

//output 12952 bytes. Sem o serlialize() foram 12072 bytes de memória

 

Achei razoável. Ficou dentro do aceitável aqui.

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.