Roberto Polen
Retirar virgula do ultimo registro de um foreach que esta dentro de outro!
05 de December de 2017 às 08:10PM
Retirar virgula do ultimo registro de um foreach que esta dentro de outro! , retirar do ultimo item do ultimo foreach.

<?php
function gravar($texto){
$arquivo = "final.json";
$fp = fopen($arquivo, "a+");
fwrite($fp, $texto);
fclose($fp);
}
$xml = simplexml_load_file('1nfe.xml') or die("Não consegui abrir o XML");

foreach($xml->NFe as $NFe)
{
foreach($xml->NFe->infNFe as $infNFe)
{
foreach($xml->NFe->infNFe->ide as $ide)
{
$numeroNF = $ide->nNF;
$serie = $ide->serie;


foreach($xml->NFe->infNFe->dest as $dest)
{
$CNPJ = $dest->CNPJ;
$xNome = $dest->xNome;

foreach($xml->NFe->infNFe->dest->enderDest as $enderDest)
{
$xLgr = $enderDest->xLgr;
$xNro = $enderDest->nro;
$xBairro = $enderDest->xBairro;
$xMun = $enderDest->xMun;

gravar("{\"Nota\":{\"$numeroNF\":{\"Entrega\":{\"Nº Nota\":$numeroNF,\"Serie\":$serie,\"CNPJ\":\"$CNPJ\",\"Cliente\":\"$xNome\",\"Endereço\":\"$xLgr\",\"Nº\":$xNro,\"Bairro\":\"$xBairro\",\"Município\":\"$xMun\"}, ");
gravar("\"itens\":{");

foreach($xml->NFe->infNFe->det as $det){
$cProd = $det->prod->cProd;
$xProd = $det->prod->xProd;
$uCom = $det->prod->uCom;
$qCom = $det->prod->qCom;
gravar("\"$cProd\" : {");

gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\",\"Quantidade\":$qCom}, "); // retirar a virgula do ultimo registro desse foreach.

}

}
}

}
}
}


gravar("},");
gravar("\"motorista\":\"Marcelo guedes\"}}} ");
?>
Jayme A. C. Gimenez
Re: Retirar virgula do ultimo registro de um foreach que esta dentro de outro!
06 de December de 2017 às 11:52AM
Normalmente, esse tipo de coisa é mais fácil controlar no primeiro registro, pois sabemos, de antemão, que ele sempre será o primeiro (para sabermos qual será o último, é preciso contar antes de começar).

Se for o primeiro registro, não coloca vírgula nenhuma. A partir do segundo registro, coloque uma vírgula antes dos dados do respectivo registro.

Para saber se se trata do primeiro registro ou não, você pode usar aquele truque de criar uma variável zerada antes do loop começar; e incrementá-la em 1 como a primeira coisa que o loop faz.
Jayme A. C. Gimenez Escreveu:
-------------------------------------------------------
> Normalmente, esse tipo de coisa é mais fácil
> controlar no primeiro registro, pois sabemos, de
> antemão, que ele sempre será o primeiro (para
> sabermos qual será o último, é preciso contar
> antes de começar).
>
> Se for o primeiro registro, não coloca vírgula
> nenhuma. A partir do segundo registro, coloque uma
> vírgula antes dos dados do respectivo registro.
>
> Para saber se se trata do primeiro registro ou
> não, você pode usar aquele truque de criar uma
> variável zerada antes do loop começar; e
> incrementá-la em 1 como a primeira coisa que o
> loop faz.

Esse loop que não estou conseguindo fazer dentro do foreach!
O que o Jayme sugeriu foi:

$frutas = ['b' => 'banana,', 'm' => 'maça,', 'l' => 'laranja,', 'a' => 'ameixa,'];

// Usando o laço
$len = count($frutas);
$i = 1;
foreach ($frutas as $key => $value) {
if ($i == $len) {
$frutas[$key] = rtrim($frutas[$key], ',');
}
$i++;
}


// Um exemplo sem loop

$keys = array_keys($frutas);
$lastKey = end($keys);
$frutas[$lastKey] = rtrim($frutas[$lastKey], ',');
Jayme A. C. Gimenez
Re: Retirar virgula do ultimo registro de um foreach que esta dentro de outro!
07 de December de 2017 às 11:01AM
Roberto Polen Escreveu:

> Esse loop que não estou conseguindo fazer dentro
> do foreach!

O foreach é um loop; um dos loops que podemos usar no PHP.

Então, sua dificuldade não é só em tirar a vírgula após o último registro, como pareceu em seu post original, é isso? Você está com dificuldade em fazer o último foreach funcionar como deveria, seria isso?
Jayme A. C. Gimenez
Re: Retirar virgula do ultimo registro de um foreach que esta dentro de outro!
07 de December de 2017 às 11:36AM
Trambulhao Escreveu:
-------------------------------------------------------
> O que o Jayme sugeriu foi:
>
> $frutas = ['b' => 'banana,', 'm' => 'maça,', 'l'
> => 'laranja,', 'a' => 'ameixa,'];
>
> // Usando o laço
> $len = count($frutas);
> $i = 1;
> foreach ($frutas as $key => $value) {
> if ($i == $len) {
> $frutas[$key] = rtrim($frutas[$key], ',');
> }
> $i++;
> }
>
>
> // Um exemplo sem loop
>
> $keys = array_keys($frutas);
> $lastKey = end($keys);
> $frutas[$lastKey] = rtrim($frutas[$lastKey], ',');

Salve, Trumbs!

Pegando uma carona no seu exemplo, o que eu sugeri, na verdade, foi um pouco diferente. Seria algo assim:

$frutas = ['b' => 'banana,', 'm' => 'maça,', 'l' => 'laranja,', 'a' => 'ameixa,'];

// Usando o laço
/*
não precisa do $len = count($frutas); É isso que a minha sugestão dispensa, pois tomaremos o primeiro registro como referência
*/
$i = 0;
foreach ($frutas as $key => $value) {
$i++
if ($i == 1) {
echo $frutas[$value];
}else{
echo ", ".$frutas[$value]; /* a vírgula viria antes, a partir do segundo, caso haja mais de um. O último, portanto, não teria vírgula após ele.*/
}
Jayme A. C. Gimenez Escreveu:
-------------------------------------------------------
> Roberto Polen Escreveu:
>
> > Esse loop que não estou conseguindo fazer
> dentro
> > do foreach!
>
> O foreach é um loop; um dos loops que podemos
> usar no PHP.
>
> Então, sua dificuldade não é só em tirar a
> vírgula após o último registro, como pareceu em
> seu post original, é isso? Você está com
> dificuldade em fazer o último foreach funcionar
> como deveria, seria isso?

Sim não estou conseguindo implementar o loop com o foreach que ja existe!
tb, Jayme.

Penso que ele precisa é de retirar "apenas" a vírgula do último item do último foreach.

@Roberto Polen é isso?

gravar("\"itens\":{");

$len = count($xml->NFe->infNFe->det);
$i = 1;

foreach ($xml->NFe->infNFe->det as $det) {
$cProd = $det->prod->cProd;
$xProd = $det->prod->xProd;
$uCom = $det->prod->uCom;
$qCom = $det->prod->qCom;
gravar("\"$cProd\" : {");

if ($len == $i) { // se for o último sem vírgula
gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\",\"Quantidade\":$qCom} ");
}
else {
gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\",\"Quantidade\":$qCom}, ");
}

$i++;
}


// Completo

function gravar($texto)
{
$arquivo = "final.json";
$fp = fopen($arquivo, "a+");
fwrite($fp, $texto);
fclose($fp);
}

$xml = simplexml_load_file('1nfe.xml') or die("Não consegui abrir o XML");

foreach ($xml->NFe as $NFe) {
foreach ($xml->NFe->infNFe as $infNFe) {
foreach ($xml->NFe->infNFe->ide as $ide) {
$numeroNF = $ide->nNF;
$serie = $ide->serie;

foreach ($xml->NFe->infNFe->dest as $dest) {
$CNPJ = $dest->CNPJ;
$xNome = $dest->xNome;

foreach ($xml->NFe->infNFe->dest->enderDest as $enderDest) {
$xLgr = $enderDest->xLgr;
$xNro = $enderDest->nro;
$xBairro = $enderDest->xBairro;
$xMun = $enderDest->xMun;

gravar("{\"Nota\":{\"$numeroNF\":{\"Entrega\":{\"Nº Nota\":$numeroNF,\"Serie\":$serie,\"CNPJ\":\"$CNPJ\",\"Cliente\":\"$xNome\",\"Endereço\":\"$xLgr\",\"Nº\":$xNro,\"Bairro\":\"$xBairro\",\"Município\":\"$xMun\"}, ");
gravar("\"itens\":{");

$len = count($xml->NFe->infNFe->det);
$i = 1;

foreach ($xml->NFe->infNFe->det as $det) {
$cProd = $det->prod->cProd;
$xProd = $det->prod->xProd;
$uCom = $det->prod->uCom;
$qCom = $det->prod->qCom;
gravar("\"$cProd\" : {");

if ($len == $i) { // se for o último sem vírgula
gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\",\"Quantidade\":$qCom} ");
}
else {
gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\",\"Quantidade\":$qCom}, ");
}

$i++;
}

}
}

}
}
}

gravar("},");
gravar("\"motorista\":\"Marcelo guedes\"}}} ");
Trambulhao Escreveu:
-------------------------------------------------------
> tb, Jayme.
>
> Penso que ele precisa é de retirar "apenas" a
> vírgula do último item do último foreach.
>
> @Roberto Polen é isso?
>
> gravar("\"itens\":{");
>
> $len = count($xml->NFe->infNFe->det);
> $i = 1;
>
> foreach ($xml->NFe->infNFe->det as $det)
> {
> $cProd = $det->prod->cProd;
> $xProd = $det->prod->xProd;
> $uCom = $det->prod->uCom;
> $qCom = $det->prod->qCom;
> gravar("\"$cProd\" : {");
>
> if ($len == $i) { // se for o último
> sem vírgula
>
> gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\
> ",\"Quantidade\":$qCom} ");
> }
> else {
>
> gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\
> ",\"Quantidade\":$qCom}, ");
> }
>
> $i++;
> }
>
>
> // Completo
>
> function gravar($texto)
> {
> $arquivo = "final.json";
> $fp = fopen($arquivo, "a+");
> fwrite($fp, $texto);
> fclose($fp);
> }
>
> $xml = simplexml_load_file('1nfe.xml') or
> die("Não consegui abrir o XML");
>
> foreach ($xml->NFe as $NFe) {
> foreach ($xml->NFe->infNFe as $infNFe) {
> foreach ($xml->NFe->infNFe->ide as $ide) {
> $numeroNF = $ide->nNF;
> $serie = $ide->serie;
>
> foreach ($xml->NFe->infNFe->dest as $dest)
> {
> $CNPJ = $dest->CNPJ;
> $xNome = $dest->xNome;
>
> foreach
> ($xml->NFe->infNFe->dest->enderDest as $enderDest)
> {
> $xLgr = $enderDest->xLgr;
> $xNro = $enderDest->nro;
> $xBairro = $enderDest->xBairro;
> $xMun = $enderDest->xMun;
>
>
> gravar("{\"Nota\":{\"$numeroNF\":{\"Entrega\":{\"N
> º
> Nota\":$numeroNF,\"Serie\":$serie,\"CNPJ\":\"$CNPJ
> \",\"Cliente\":\"$xNome\",\"Endereço\":\"$xLgr\",
> \"Nº\":$xNro,\"Bairro\":\"$xBairro\",\"Município
> \":\"$xMun\"}, ");
> gravar("\"itens\":{");
>
> $len = count($xml->NFe->infNFe->det);
> $i = 1;
>
> foreach ($xml->NFe->infNFe->det as $det)
> {
> $cProd = $det->prod->cProd;
> $xProd = $det->prod->xProd;
> $uCom = $det->prod->uCom;
> $qCom = $det->prod->qCom;
> gravar("\"$cProd\" : {");
>
> if ($len == $i) { // se for o último
> sem vírgula
>
> gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\
> ",\"Quantidade\":$qCom} ");
> }
> else {
>
> gravar("\"Descricao\":\"$xProd\",\"Tipo\":\"$uCom\
> ",\"Quantidade\":$qCom}, ");
> }
>
> $i++;
> }
>
> }
> }
>
> }
> }
> }
>
> gravar("},");
> gravar("\"motorista\":\"Marcelo guedes\"}}} ");

Desculpe estava fora, e isso sim @Trambulhao, obrigado a todos funcionou, com o código de vcs descobri pq eu não estava conseguindo fazer LOOP.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.