Ir para conteúdo
wneo

Como Somar em forEach e explode

Recommended Posts

Olá!

Pessoal, preciso somar os valores vindos da tabela...

Por exemplo,

*Tenho 2 tabelas:

-Produtos e budget;

-Ao criar um budget, escolho os produtos e salvo o id de cada um separado por virgula em um campo da budget;

 

1-Receber os valores em um foreach, pq eles estavam agrupados por vírgula em um campo;

2-Exibir individualmente esses valores ($valor_cobrado);

3-Somar e exibir na tela o total, que é a soma desses valores.

 

O 1 e 2 já estão ok....

<form class="form_budget" id="form_update_budget">

<?php	
	
	while($row = mysql_fetch_array($rs_budgets)){
	$id_budget = $row['id_budget'];
	$id_produto = $row['id_produto'];
	$nome_budget = $row['nome_budget'];	

?>
<fieldset>
<legend align="left"><?php echo $nome_budget; ?></legend>

<li>
<label><span>Choosed products</span></label>
<?php

	$prepara_resultado= explode(",", $id_produto);
	
	foreach($prepara_resultado as $newvalue){    
	$sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
		 
	$prepara_resultado = mysql_query($sql_produto_escolhido);
    $row = mysql_fetch_assoc($prepara_resultado);
	
    $id_produto_escolhido = $row['id_produto_escolhido'];
	$nome_produto_escolhido = $row['nome_produto']; 			 
	$valor_cobrado = $row['valor_cobrado']; 
		
	
?>
<b><?php echo $nome_produto_escolhido; ?>(R$<b class="<?php echo $id_produto_escolhido; ?>_valor_produto"><?php echo $valor_cobrado; ?></b>) </b> - 
		
<?php
}//end foreach explode

?>
</li>

<li>
<label><span>Valor total</span></label>
<b class="valor_total"></b>
</li>

<button>Abrir</button>

</fieldset>
<?php
}//end while budgets

?>
</form>

....Alguém consegue chegar no 3?????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resumindo... você quer somar todos os valor_cobrado que entram no foreach?

 

<?php

    $valor_total = 0;

	foreach($prepara_resultado as $newvalue){    
	    $sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
	    $prepara_resultado = mysql_query($sql_produto_escolhido);
        $row = mysql_fetch_assoc($prepara_resultado);
        $id_produto_escolhido = $row['id_produto_escolhido'];
	    $nome_produto_escolhido = $row['nome_produto']; 			 
	    $valor_cobrado = $row['valor_cobrado']; 
	    $valor_total = $valor_total+$valor_cobrado;
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não da para saber exatamente a sua estrutura mas eu prefiro e recomendo sempre realizar somas direto na query do mysql.
além de deixar mais rapido o código você economiza algumas linhas de comando

 

Sugestões de calculo direto na query

SELECT sum(valor) as valor
SELECT sum(if(produto='caixa',valor,null)) as valor

No primeiro somo todos os valores da coluna valor

No segundo somo todos os valores da coluna valor se na coluna produto for igual a caixa.

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 horas atrás, Maykel-ctba disse:

Resumindo... você quer somar todos os valor_cobrado que entram no foreach?

 


<?php

    $valor_total = 0;

	foreach($prepara_resultado as $newvalue){    
	    $sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
	    $prepara_resultado = mysql_query($sql_produto_escolhido);
        $row = mysql_fetch_assoc($prepara_resultado);
        $id_produto_escolhido = $row['id_produto_escolhido'];
	    $nome_produto_escolhido = $row['nome_produto']; 			 
	    $valor_cobrado = $row['valor_cobrado']; 
	    $valor_total = $valor_total+$valor_cobrado;
?>

Assim o total mostra 0...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, Guilherme Luiz disse:

Não da para saber exatamente a sua estrutura mas eu prefiro e recomendo sempre realizar somas direto na query do mysql.
além de deixar mais rapido o código você economiza algumas linhas de comando

 

Sugestões de calculo direto na query


SELECT sum(valor) as valor
SELECT sum(if(produto='caixa',valor,null)) as valor

No primeiro somo todos os valores da coluna valor

No segundo somo todos os valores da coluna valor se na coluna produto for igual a caixa.

tentei adicionar assim:

<!-- .................................................................. -->

<form class="form_budget" id="form_update_budget">

<?php	
	
	while($row = mysql_fetch_array($rs_budgets)){
	$id_budget = $row['id_budget'];
	$id_produto = $row['id_produto'];
	$nome_budget = $row['nome_budget'];	

?>
<fieldset>
<legend align="left"><?php echo $nome_budget; ?></legend>

<li>
<label><span>Choosed products</span></label>
<?php

	$prepara_resultado= explode(",", $id_produto);
	
	foreach($prepara_resultado as $newvalue){    
	$sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
		 
	$prepara_resultado = mysql_query($sql_produto_escolhido);
    $row = mysql_fetch_assoc($prepara_resultado);
	
    $id_produto_escolhido = $row['id_produto_escolhido'];
	$nome_produto_escolhido = $row['nome_produto']; 			 
	$valor_cobrado = $row['valor_cobrado']; 
		
?>
<b><?php echo $nome_produto_escolhido; ?>(R$<b class="<?php echo $id_produto_escolhido; ?>_valor_produto"><?php echo $valor_cobrado; ?></b>) </b> - 
		
<?php
}//end foreach explode

$valorTotal = 0;
foreach($passa as $valor){
  	$sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
		 
	$prepara_resultado = mysql_query($sql_produto_escolhido);
    $row = mysql_fetch_assoc($prepara_resultado);

	$id_produto_escolhido = $row['id_produto_escolhido'];
	$nome_produto_escolhido = $row['nome_produto']; 			 
	$valor_cobrado = $row['valor_cobrado']; 
	
	$soma_valor_cobrado = "SELECT sum(valor_cobrado) FROM produtos";
	$rs_soma_valor_cobrado = mysql_query($soma_valor_cobrado);
	$row2 = mysql_fetch_assoc($rs_soma_valor_cobrado);
	$valor_cobrado_final = $row2['valor_cobrado']; 
	echo 'Valor total '.$rs_soma_valor_cobrado;

}	
?>
</li>

<li>
<label><span>Valor total</span></label>
<b class="valor_total"></b>
</li>

<button>Abrir</button>

</fieldset>
<?php
}//end while budgets



?>
</form>

</div><!-- /budget_box-->
<!-- ......................... /budget box ......................... -->

Mas não mostra nada...:pensive:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, então o $valor_cobrado não é um float/int (ou seja, não é um número válido para somas), ou ele vem como zero mesmo.

 

Fiz um exemplo super curto de somas em laço (for, foreach, while)

<?php

	$arrayValores = array(135.80, 112.30, 1.99);
	$valorTotal = 0;

	for ($i = 0; $i < count($arrayValores); $i++ ){
		$valorTotal += $arrayValores[$i];
	}

	echo $valorTotal;

// * Imprimirá "250.09"

Veja se te ajuda em algo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, Maykel-ctba disse:

Cara, então o $valor_cobrado não é um float/int (ou seja, não é um número válido para somas), ou ele vem como zero mesmo.

 

Fiz um exemplo super curto de somas em laço (for, foreach, while)


<?php

	$arrayValores = array(135.80, 112.30, 1.99);
	$valorTotal = 0;

	for ($i = 0; $i < count($arrayValores); $i++ ){
		$valorTotal += $arrayValores[$i];
	}

	echo $valorTotal;

// * Imprimirá "250.09"

Veja se te ajuda em algo.

Tentei assim:

<!-- .................................................................. -->

<form class="form_budget" id="form_update_budget">

<?php	
	
	while($row = mysql_fetch_array($rs_budgets)){
	$id_budget = $row['id_budget'];
	$id_produto = $row['id_produto'];
	$nome_budget = $row['nome_budget'];	

?>
<fieldset>
<legend align="left"><?php echo $nome_budget; ?></legend>

<li>
<label><span>Choosed products</span></label>
<?php

	$prepara_resultado= explode(",", $id_produto);
	
	foreach($prepara_resultado as $newvalue){    
	$sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
		 
	$prepara_resultado = mysql_query($sql_produto_escolhido);
    $row = mysql_fetch_assoc($prepara_resultado);
	
    $id_produto_escolhido = $row['id_produto_escolhido'];
	$nome_produto_escolhido = $row['nome_produto']; 			 
	$valor_cobrado = $row['valor_cobrado']; 
	
	$arrayValores = array($valor_cobrado);
	$valorTotal = 0;

	for ($i = 0; $i < count($arrayValores); $i++ ){
		$valorTotal += $arrayValores[$i];
	}

	echo $valorTotal;
		
?>
<b><?php echo $nome_produto_escolhido; ?>(R$<b class="<?php echo $id_produto_escolhido; ?>_valor_produto"><?php echo $valor_cobrado; ?></b>) </b> - 
	
<?php
}//end foreach produtos
?>
</li>

<li>
<label><span>Valor total</span></label>
<b class="valor_total"></b>
</li>

<button>Abrir</button>

</fieldset>
<?php
}//end while budgets

?>
</form>

</div><!-- /budget_box-->
<!-- ......................... /budget box ......................... -->

Mas apenas repete os valores originais, sem somar um com o outro...

Por exemplo, Produto1 - R$100 e Produto2 R$50, usando o código acima tenho como resultado isso: 10050...:pensive:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, certifique-se que seus valores são válidos.

R$100,00 é diferente de 100.00 (este sim, é válido para somas).

 

Pelo que parece, ele está concatenando variáveis, significa que não são valores inteiros para serem somados.

 

Depois, veja que você está criando o array dentro do foreach. Crie ele fora, e apenas adicione os índices dentro do foreach.

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, Maykel-ctba disse:

Primeiro, certifique-se que seus valores são válidos.

R$100,00 é diferente de 100.00 (este sim, é válido para somas).

 

Pelo que parece, ele está concatenando variáveis, significa que não são valores inteiros para serem somados.

 

Depois, veja que você está criando o array dentro do foreach. Crie ele fora, e apenas adicione os índices dentro do foreach.

Estou usando int.. no bd está 100 e 50..

Coloquei fora do foreach:

<!-- .................................................................. -->

<form class="form_budget" id="form_update_budget">

<?php	
	
	while($row = mysql_fetch_array($rs_budgets)){
	$id_budget = $row['id_budget'];
	$id_produto = $row['id_produto'];
	$nome_budget = $row['nome_budget'];	

?>
<fieldset>
<legend align="left"><?php echo $nome_budget; ?></legend>

<li>
<label><span>Choosed products</span></label>
<?php

	$prepara_resultado= explode(",", $id_produto);
	
	foreach($prepara_resultado as $newvalue){    
	$sql_produto_escolhido="SELECT * FROM produtos WHERE id_produto='$newvalue'";			
		 
	$prepara_resultado = mysql_query($sql_produto_escolhido);
    $row = mysql_fetch_assoc($prepara_resultado);
	
    $id_produto_escolhido = $row['id_produto_escolhido'];
	$nome_produto_escolhido = $row['nome_produto']; 			 
	$valor_cobrado = $row['valor_cobrado']; 
		
		
?>
<b><?php echo $nome_produto_escolhido; ?>(R$<b class="<?php echo $id_produto_escolhido; ?>_valor_produto"><?php echo $valor_cobrado; ?></b>) </b> - 
	
<?php
}//end foreach produtos

$arrayValores = array($valor_cobrado);
	$valorTotal = 0;

	for ($i = 0; $i < count($arrayValores); $i++ ){
		$valorTotal += $arrayValores[$i];
	}

	echo $valorTotal;
?>
</li>

<li>
<label><span>Valor total</span></label>
<b class="valor_total"></b>
</li>

<button>Abrir</button>

</fieldset>
<?php
}//end while budgets

?>
</form>

Como coloquei, aparece somente o ultimo registro.. por exemplo, se tenho 100 e 50,

mostra somente 50...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim:

 

<form class="form_budget" id="form_update_budget">
	<?php	
		
		while($row = mysql_fetch_array($rs_budgets)){

			echo "
			<fieldset>
				<legend align=\"left\">".$row['nome_budget']."</legend>
				<li>
					<label><span>Choosed products</span></label>";

				$prepara_resultado= explode(",", $row['id_produto']);
				$valorTotal = 0;
				
				foreach ($prepara_resultado as $newvalue){  

					$sql_produto_escolhido = "SELECT * FROM produtos WHERE id_produto='$newvalue'";			
					$prepara_resultado = mysql_query($sql_produto_escolhido);
				    $row = mysql_fetch_assoc($prepara_resultado);
					$valorTotal += $row['valor_cobrado'];

					echo "<b>".$row['nome_produto']."(R$<b class=\"".$row['id_produto_escolhido']."_valor_produto\">".$row['valor_cobrado']."</b>) </b> - ";
				}

				echo "
				</li>
				<li>
					<label><span>Valor total</span></label>
					<b class=\"valor_total\">R$".$valorTotal."</b>
				</li>
				<button>Abrir</button>
			</fieldset>";
		}
	?>
</form>

 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, Maykel-ctba disse:

Tente assim:

 


<form class="form_budget" id="form_update_budget">
	<?php	
		
		while($row = mysql_fetch_array($rs_budgets)){

			echo "
			<fieldset>
				<legend align=\"left\">".$row['nome_budget']."</legend>
				<li>
					<label><span>Choosed products</span></label>";

				$prepara_resultado= explode(",", $row['id_produto']);
				$valorTotal = 0;
				
				foreach ($prepara_resultado as $newvalue){  

					$sql_produto_escolhido = "SELECT * FROM produtos WHERE id_produto='$newvalue'";			
					$prepara_resultado = mysql_query($sql_produto_escolhido);
				    $row = mysql_fetch_assoc($prepara_resultado);
					$valorTotal += $row['valor_cobrado'];

					echo "<b>".$row['nome_produto']."(R$<b class=\"".$row['id_produto_escolhido']."_valor_produto\">".$row['valor_cobrado']."</b>) </b> - ";
				}

				echo "
				</li>
				<li>
					<label><span>Valor total</span></label>
					<b class=\"valor_total\">R$".$valorTotal."</b>
				</li>
				<button>Abrir</button>
			</fieldset>";
		}
	?>
</form>

 

Sem palavras... deu certo!!!=D:rank_03:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por JOSELUISALD
      Bom dia. Em minha aplicação o cliente quer uma cópia de seu sistema localmente e remoto (hospedado). Tem como eu fazer a sincronização dos bancos de dados, para que tudo que seja feito localmente seja inserido automaticamente no banco remoto? Desde já obrigado.
    • Por Hannah25
      Eu estou criando um cms, encontrei algumas barreiras para concluir o projeto, alguém sabe como o wordpress substitui a função include pelas abreviações: wp_header(), wp_footer() e wp_ ?
      joker123 หวยหุ้น
      Seja lá o que for esta bem escondido naquele código enorme : (  
      Se alguém souber me ajude a criar essa função! ou uma alternativa sem ser a tradicional include uma personalizada...
    • Por Paulo Oliveira Albuquerque
      Ola pessoal
      Eu criei o meu codigo para listar os modulos de uma tabela do banco de dados
       
         ele funciona certo
       
        Só que neste código eu quero que ele me faz uma contagem do nome da tabela que onde esta os nome preciso para a listagem
       Ex:
      /// TABELA DO MODULO ///
      id      nome                            url                status      tabela    cor_bloco
      1      Nome da cidade       city.php           S            city            blue
      2      Nome da cidade2     city2.php         S           city2          blue
       
      Obs: Esta TABELA e as das cidades que quero que faz a contagem de quantos registro tem nela
       
      No php fiz assim
      <?php /* Connect To Database*/ require_once ("../conexion.php"); mysqli_set_charset($con,"utf8"); $action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:''; if($action == 'ajax'){ $query = mysqli_real_escape_string($con,(strip_tags($_REQUEST['query'], ENT_QUOTES))); $tables="modulos"; $campos="*"; $sWhere=" modulos.tabela LIKE '%".$query."%' OR modulos.nome LIKE '%".$query."%' OR modulos.id LIKE '%".$query."%'"; $sWhere.=" order by modulos.id DESC"; $tables1="modulos"; $campos1="*"; $sWhere1=" modulos.tabela"; //$sWhere1.=" order by modulos.id"; include 'pagination.php'; //include pagination file //pagination variables $page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1; $per_page = intval($_REQUEST['per_page']); //how much records you want to show $adjacents = 10; //gap between pages after number of adjacents $offset = ($page - 1) * $per_page; //Count the total number of row in your table*/ $count_query = mysqli_query($con,"SELECT count(*) AS numrows FROM $tables where $sWhere "); if ($row= mysqli_fetch_array($count_query)){$numrows = $row['numrows'];} else {echo mysqli_error($con);} $total_pages = ceil($numrows/$per_page); //main query to fetch the data $query = mysqli_query($con,"SELECT $campos FROM $tables where $sWhere LIMIT $offset,$per_page"); //loop through fetched data if ($numrows>0){ ?> <?php //Contatar o total numeros das tabelas*/ $query = mysqli_query($con,"SELECT count(*) AS numrows FROM $sWhere1 "); if ($row= mysqli_fetch_array($query)){$numrows = $row['numrows'];} else {echo mysqli_error($con);} $contagem = ceil($numrows); //main query to fetch the data $query = mysqli_query($con,"SELECT $campos1 FROM $sWhere1"); //loop through fetched data if ($numrows>0){ ?>      
      <section class="content"> <!-- Small boxes (Stat box) --> <div class="row"> <?php $finales=0; while($modulos = mysqli_fetch_array($query)){ $id = $modulos['id']; $nome = $modulos['nome']; $url = $modulos['url']; $tabela = $modulos['tabela']; $cor_blocos = $modulos['cor_blocos']; $icone = $modulos['icone']; $status = '1'; $finales++; ?> <div class="col-lg-3 col-xs-6"> <!-- small box --> <div class="small-box bg-<?php echo ConfigPainel('cor_blocos'); ?>"> <div class="inner"> <h3><?php echo $contagem; ?></h3> <!-- AQUI É CONTADOR --> <p><?php echo $modulos['nome']; ?></p> </div> <div class="icon"> <i class="fa <?php echo $modulos['icone']; ?>"></i> </div> <a href="<?php echo $modulos['url']; ?>" class="small-box-footer">Gerenciar de Modulo <i class="fa <?php echo $modulos['icone']; ?>"></i></a> </div> </div> <!-- ./col --> <?php } } ?> <div class="col-md-12"> <div class="form-control"> <?php $inicios=$offset+1; $finales+=$inicios -1; echo "Mostrando $inicios al $finales de $numrows registros"; echo paginate( $page, $total_pages, $adjacents); ?> </div> </div> </div> <?php } } ?> </section>  
×

Informação importante

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