Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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" ]
];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
vc só pode chamar de "Desafio" se vc mesmo souber como resolver.
Editei o título.
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!
Não lembro onde eu vi, mas acho que a função json encode é mais rápida que a serialize.
Se eu tiver errado me avise.
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.
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.
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?
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.
wow.. that was odd =P
Ainda que eu usasse as 100k entradas, serão no máximo 26 acessadas em cada linha, com duas associações para cada uma delas (no máximo). Vou serializar e usar a função daquele artigo para analisar o tamanho do rombo.
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
Você mesmo que marca o post que resolveu sua dúvida como resolvido, aproveite e de um ponto de reputação para a pessoa que te ajudou =)
Bem lembrado Raul. Já mandei bala =]
Use a função serialize().