Ir para conteúdo

POWERED BY:

Arquivado

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

mkboy

While dentro de um Json

Recommended Posts

Bom dia,

Estou montando um Json no PHP para envio.

Os dados precisam ser apresentados como no quadro vermelho, no caso são dois registros.

Portanto, estou fazendo um SELECT na tabela do Carrinho e preciso exibir os respectivos registros.

Tentei colocar um WHILE ai, mas não aceita.

Como faço isso no PHP?

json.png

Agradeço desde já a atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postando em texto:

$jSon = '{
	"cep_origem": "'.$cepOrigem.'",
	"cep_destino": "'.$cepDestino.'",
	"valor_notafiscal": "'.$valorNf.'",
	"prazo_adicional": "'.$prazoAdicional.'",
	"preco_adicional": "'.$precoAdicional.'",
	"volumes": [
											
														
		{
			"sku": "A-01",
		},
                {
                        "sku": "A-02",
                }
										
			
		  ]
}';
$jSon = '{
    "cep_origem": "'.$cepOrigem.'",
    "cep_destino": "'.$cepDestino.'",
    "valor_notafiscal": "'.$valorNf.'",
    "prazo_adicional": "'.$prazoAdicional.'",
    "preco_adicional": "'.$precoAdicional.'",
    "volumes": [
											
	// O WHILE PRECISARIA COMEÇAR AQUI 				
        {
            "sku": "A-01",
        },
										
	// E TERMINAR AQUI
			
	 ]
	}';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei como estão vindo os dados da base para um possível refinamento, mas com o que você postou, me parece que não precisa de loop, veja:

$volumes = array( array('sku' => 'A-01'), array('sky' => 'A-02'));

$json = array('cep_origem' => $cepOrigem, 
    'cep_destino' => $cepDestino,
    'valor_notafical' => $valorNf,
    'prazo_adicional' => $prazoAdicional,
    'preco_adicional' => $precoAdicional,
    'volumes' => $volumes );

echo json_encode($json);

Vai ter o mesmo resultado da imagem que você postou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você tem um JSON, da decode nele que trabalha de boas pelo PHP.

<?php

$cepOrigem		= '05373020';
$cepDestino		= '05373030';
$valorNf		= '15.48';
$prazoAdicional = '15';
$precoAdicional = '15';


$skus = array(
	 "sku" => "A-01"
	,"sku" => "A-02"
	,"sku" => "A-03"
	,"sku" => "A-04"
);


$json = '{
	"cep_origem": "'.$cepOrigem.'",
	"cep_destino": "'.$cepDestino.'",
	"valor_notafiscal": "'.$valorNf.'",
	"prazo_adicional": "'.$prazoAdicional.'",
	"preco_adicional": "'.$precoAdicional.'",
	"volumes": []
}';
$json = json_decode($json);
$json->volumes = $skus;

print json_encode($json);

{"cep_origem":"05373020","cep_destino":"05373030","valor_notafiscal":"15.48","prazo_adicional":"15","preco_adicional":"15","volumes":{"sku":"A-04"}}

Recomendo esse site:

http://jsonviewer.stack.hu/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, agradecendo pela ajuda.

Os dois exemplos rodaram, porém o segundo só retornou o ultimo registro do arry.

Ai, ficou assim, esse está retornando resultado da API.

$volumes = array( 
array('sku' => 'A-01', 'quantidade'=>  '1','preco'=>  '15,20','altura'=>  '35','comprimento'=>  '10','largura'=>  '30','peso'=>  '2'), 
array('sku' => 'A-01', 'quantidade'=>  '1','preco'=>  '15,20','altura'=>  '35','comprimento'=>  '10','largura'=>  '30','peso'=>  '2')
);	
						 	
$json = array('cep_origem' => $cepOrigem, 
'cep_destino' => $cepDestino,
'valor_notafiscal' => $valorNf,
'prazo_adicional' => $prazoAdicional,
'preco_adicional' => $precoAdicional,
'volumes' => $volumes );
							
$jSon = json_encode($json);

A minha dúvida, é como faço para montar esse array com um WHILE, exemplo:

Eu preciso montar um SKU para cada registro do banco, abaixo coloquei o While para ilustrar o que preciso:

$volumes = array( 
							
	 while($rowProd = mysql_fetch_array($qry_prod, MYSQL_ASSOC)) {
							
		array('sku' => 'A-01', 'quantidade'=>  '1','preco'=>  '15,20','altura'=>  '35','comprimento'=>  '10','largura'=>  '30','peso'=>  '2'), 
							 
	 }
);	

Como faço isso no PHP?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O $rowProd corresponde a esse array('sku' => ...) abaixo, se for basta fazer isso:

$volumes = array();

while($rowProd = mysql_fetch_array($qry_prod, MYSQL_ASSOC)) {                
      
      $volumes[] = $rowProd;

      /** Estou imaginando que o $rowProd contem esse valor:  
       *array('sku' => 'A-01', 'quantidade'=> '1','preco'=> '15,20','altura'=> '35','comprimento'=>'10','largura'=>  '30','peso'=> '2')
       */
 }

Se não, a ideia é essa, declare $volumes = array(); antes do loop, e alimente ele dentro do loop

Não deixe de dar uma olhada depois:
http://php.net/manual/pt_BR/book.array.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué percorre todos os seus registros e durante o Loop do While você 'reescreve' esse array (ou retorno do banco como queira).

A ideia é reescrever o array antes de dar o json_encode.

<?php

/*
$dados representa o seu banco...
seria como eu tivesse feito assim:
$dados = mysql_fetch_array($qry_prod, MYSQL_ASSOC)
*/

$dados = array(
	array(
		 'id' 		=> 1
		,'nome'		=> 'Gabriel'
		//,'volumes' 	=> array()
	)
	
	,array(
		 'id' 		=> 2
		,'nome'		=> 'edcesar'
		//,'volumes' 	=> array()
	)
		
	,array(
		 'id' 		=> 2
		,'nome'		=> 'mkboy'
		//,'volumes' 	=> array()
	)
);

for($i = 0; $i < count($dados); $i++){	
	//Da forma abaixo mesmo se não existir esse indice no array, acaba sendo criado
	$dados[$i]['volumes'] = array('sku1', 'sku2', 'sku3');
}
/*
var_dump($dados);
array (size=3)
  0 => 
    array (size=3)
      'id' => int 1
      'nome' => string 'Gabriel' (length=7)
      'volumes' => 
        array (size=3)
          0 => string 'sku1' (length=4)
          1 => string 'sku2' (length=4)
          2 => string 'sku3' (length=4)
  1 => 
    array (size=3)
      'id' => int 2
      'nome' => string 'edcesar' (length=7)
      'volumes' => 
        array (size=3)
          0 => string 'sku1' (length=4)
          1 => string 'sku2' (length=4)
          2 => string 'sku3' (length=4)
  2 => 
    array (size=3)
      'id' => int 2
      'nome' => string 'mkboy' (length=5)
      'volumes' => 
        array (size=3)
          0 => string 'sku1' (length=4)
          1 => string 'sku2' (length=4)
          2 => string 'sku3' (length=4)
*/
	

	

Caso não tenha pegado o conceito

Recomendo a leitura:

https://secure.php.net/manual/pt_BR/language.types.array.php

@dicaExtra

foreach($produtos as $prod){

Ele não reescreve array, por isso a necessidade do domínio do for()

@dica2:

Recentemente tive uma duvida parecida com a sua.

o @AndersonMamede compartilhou uma maneira interessante , talvez te ajude:

http://forum.imasters.com.br/topic/555304-duvida-a-respeito-de-estrutura/?p=2215127

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, quero agradecer novamente pelo empenho e me desculpar pois por mais explicado que tenha sido, ainda me não entendi bem.

Talvez, o que esteja me complicado, é que estou migrado no ASP e isso talvez me confunda mais..

Mas, vou novamente ao caso.

Esse exemplo:

while($rowProd = mysql_fetch_array($qry_prod, MYSQL_ASSOC)) {
											  
     $var_sku = $rowProd['b_id_prod'];
     // ocultei as outras variaveis para ficar mais simples de visualizar
				
     $volumes = array(
        array('sku' => ''.$var_sku.'', 'quantidade'=>  ''.$var_qtd.'','preco'=>  ''.$varValorProd_00.'','altura'=>  ''.$var_altura.'','comprimento'=>  ''.$var_comprimento.'','largura'=>  ''.$var_altura.'','peso'=>  ''.$var_peso.'')
     );	
	 
}

Está gerando esse Json.


{"cep_origem":"09510101","cep_destino":"09510101","valor_notafiscal":"200,00","prazo_adicional":"0","preco_adicional":"0","volumes":[
{"sku":"55","quantidade":"1","preco":"2820,24","altura":"10","comprimento":"20","largura":"10","peso":"0,5"}]}

Portanto neste loop, tem 3 registro no banco de dados, logo, minha expectativa é que ficasse assim:

{"cep_origem":"09510101","cep_destino":"09510101","valor_notafiscal":"200,00","prazo_adicional":"0","preco_adicional":"0","volumes":[
{"sku":"55","quantidade":"1","preco":"2820,24","altura":"10","comprimento":"20","largura":"10","peso":"0,5"},
{"sku":"56","quantidade":"2","preco":"30,24","altura":"10","comprimento":"20","largura":"10","peso":"0,5"},
{"sku":"57","quantidade":"1","preco":"50,24","altura":"10","comprimento":"20","largura":"10","peso":"0,5"}]}

Então, a cada volta do While, deveria acrescer uma linha respectivo a um registro, no array $volumes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda, adiconei os [] e acrescentou os registros... perfeito! :D

Mas, surgiu outro detalhe :rolleyes:

Veja, esse é o que traz resultado:

{"cep_origem":"09510101","cep_destino":"09510101","valor_notafiscal":"200,00","prazo_adicional":"0","preco_adicional":"0","volumes":
[{"sku":"32","quantidade":"1","preco":"200,00","altura":"10","comprimento":"20","largura":"10","peso":"0,1"}]}

E agora com os colchetes

{"cep_origem":"09510101","cep_destino":"09510101","valor_notafiscal":"200,00","prazo_adicional":"0","preco_adicional":"0","volumes":
[[{"sku":"32","quantidade":"1","preco":"200,00","altura":"10","comprimento":"20","largura":"10","peso":"0,1"}],
[{"sku":"10","quantidade":"1","preco":"48575,00","altura":"10","comprimento":"90","largura":"10","peso":"1,2"}],
[{"sku":"1646","quantidade":"1","preco":"1805,00","altura":"10","comprimento":"30","largura":"10","peso":"0,0"}]]}

Veja, que no primeiro registro, o SKU 32 ele abre dois colchetes.

Comparando com o Json que envia e retorna resultado e o que retorna erro foi essa a diferença que ví...

Como remover esse colchete extra? :huh:

Obrigado novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tira um array, ficando assim:

$volumes[] = array('sku' => ''.$var_sku.'', 'quantidade'=> ''.$var_qtd.'','preco'=> ''.$varValorProd_00.'','altura'=> ''.$var_altura.'','comprimento'=> ''.$var_comprimento.'','largura'=> ''.$var_altura.'','peso'=> ''.$var_peso.'');   

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.