Ir para conteúdo

POWERED BY:

Arquivado

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

Carcleo

[Resolvido] Enumerar indices do array

Recommended Posts

Pessoal.

Bom dia!

 

Dei um print_r num array

print_r($cores_array);

E me retornou em tela assim:

Array
(
[0] => 1
[1] => 01_BRANCO
[2] => 1
[3] => 01_BRANCO
[4] => 1
[5] => 01_BRANCO
[6] => 2
[7] => Preta
[8] => 2
[9] => Preta
)

Porem, preciso retirar os valores duplicados e use a função array_unique para eliminar as repetições

$cores_unique = array_unique($cores_array);
  print_r($cores_unique);

Deu um print_r no resultado e resultou assim

Array
(
[0] => 1
[1] => 01_BRANCO
[6] => 2
[7] => Preta
)

Acontece, que ele pegou os números dos índices também 0,1..6,7......... E eu gostaria que, alem de retirar os índices repetidos, ele tamabem arranjasse os índices tipo 0,1,2,3....

Assim:

Array
(
[0] => 1
[1] => 01_BRANCO
[2] => 2
[3] => Preta
.............
)

Há uma função que faça isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

assim?

$cores_unique = array_values(array_unique($cores_array));

Deu certo.

 

Pode me ajudar nessa situação que não consigo sair dela?

 

http://forum.imasters.com.br/topic/471634-busca-no-array-como-fazer/

 

Valeu

 

Aproveitando.

 

Deixa eu fazer duas perguntas?

 

1) o mysqli_fetch_all, para funcionar no servidor, tem que habiltar alguma coisa?

 

2) Porque esse script não funciona nem no ff nem no chrome. só no ie?

function valida_carrinho(form, itens) 
{
   with (form) 
{   	
    j=0;
       for (var i=0; i < (itens-1)*2; i++) 
	{              
		  if (elements(j).value > elements(j+1).value) 
		  {
			  alert('Observe um dos produtos do carrinho\nVocê adicionou '+elements(j).value+' \nPorem, só tem '+ elements(j+1).value);
			  elements(j).focus();
			  exit;
		  }     				
		  j=j+2;
       }
	form.submit();
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aproveitando.

 

Deixa eu fazer duas perguntas?

 

1) o mysqli_fetch_all, para funcionar no servidor, tem que habiltar alguma coisa?

http://br2.php.net/manual/pt_BR/mysqli.requirements.php

 

2) Porque esse script não funciona nem no ff nem no chrome. só no ie?

function valida_carrinho(form, itens) 
{
   with (form) 
{   	
    j=0;
       for (var i=0; i < (itens-1)*2; i++) 
	{              
		  if (elements(j).value > elements(j+1).value) 
		  {
			  alert('Observe um dos produtos do carrinho\nVocê adicionou '+elements(j).value+' \nPorem, só tem '+ elements(j+1).value);
			  elements(j).focus();
			  exit;
		  }     				
		  j=j+2;
       }
	form.submit();
   }
}

 

Provavelmente porque a função elements() só existe/funciona no IE. Porque só o IE possui o atributo form.itens, porque o IE enumera os elementos de forma diferente dos outros navegadores, enfim.

 

Tem como postar a markup desse formulário aí??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem sim.

Segue:

<form method="post" action="altera_carrinho.php?op=atualizar" id="form_carrinho" name="form_carrinho">
<table BORDER=0 WIDTH="95%" align="center">
<tr BGCOLOR="#0080C0"><td align="center" colspan="9">Pedido: <?php  echo $_SESSION["numped"]; ?></td></tr>
<tr BGCOLOR="#004080">
<td align="center" width="30%">Produto</td>
<td align="center" width="10%">Estoque</td>
<td align="center" width="15%">PREÇO UNITÁRIO</td>
<td align="center" width="15%">Quant.</td>
<td align="center" width="15%">TOTAL</td>
<td align="center" width="15%">EXCLUIR</td>
</tr>

<?php 

  $QuerySQL_produtos = 
  "
	 select 
	   id_produtos_varejo,
	   nome_produtos_varejo, 
	   preco_produtos_varejo,
	   estoque_produtos_varejo
	  from 
		 produtos_varejo
	  " . $_SESSION["MeuCarrinhoAltera"]->QuerySQL_ObtemListaDeItens(). ")
	  order by  
		nome_produtos_varejo
  ";
  $Resultado = $MySQL->query($QuerySQL_produtos);

  $preco_total = 0.00;

  while(list($id, $nome, $preco, $estoque) = $MySQL->fetch_row($Resultado)) 
  {
	  //Computando preco total
	  $preco_total = $preco_total + $_SESSION["MeuCarrinhoAltera"]->ObtemSubTotalDeUmItem($id,$preco);
	  $_SESSION["valor_total_da_nota"] = $preco_total;
  ?>		
     <tr>
       <td align='left'><font size=-1><?php echo $nome;?></font></td>
       <td align='center'><font size=-1><?php echo $estoque;?></font></td>
       <td align='center'>R$ <?php echo number_format($preco, 2, '.', '');?> </td>
       <td align='center'>
         <input style="text-align:right" type="text" id="<?php echo $id;?>"  name="<?php echo $id;?>" size="2" value="<?php echo $_SESSION["MeuCarrinhoAltera"]->ObtemQuantidadeItem($id);?>" onkeypress="BloqueiaLetras();" />
         <input type="hidden" id="<?php echo "hd".$id;?>" name="<?php echo "hd".$id;?>" value="<?php echo $estoque;?>" />
       </td>
       <td align='center'>R$ <?php echo number_format($_SESSION["MeuCarrinhoAltera"]->ObtemSubTotalDeUmItem($id,$preco), 2, '.', '');?></td>		  
       <td align='center'><b>
       <a href="altera_carrinho.php?op=excluir&id_prod=<?php echo $id;?>">Excluir</a>
       </b></td>
     </tr>
  <?php		
  }
?>
<tr>
  <td align="center" bgcolor="#66FF99" colspan="7">
	    Valor Total da Nota:   R$ <?php  echo number_format($_SESSION["valor_total_da_nota"], 2, '.', '');?>
  </td>
</tr>
 <tr>
     <td align="center" colspan="7"> 
        <input type="button"  onclick="return valida_carrinho(this.form, <?php echo $_SESSION["MeuCarrinhoAltera"]->QuantosItens();?>)" value="Atualizar" name="Atualizar" WIDTH="78" HEIGHT="20" /><br>
     </td>
 </tr>  
 </table>
   </form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.

Se markup gerado for isso. O html esta aí.

<form method="post" action="altera_carrinho.php?op=atualizar" id="form_carrinho" name="form_carrinho">
<table BORDER=0 WIDTH="95%" align="center">
<tr BGCOLOR="#0080C0"><td align="center" colspan="9">Pedido: 37</td></tr>
<tr BGCOLOR="#004080">
<td align="center" width="30%">Produto</td>
<td align="center" width="10%">Estoque</td>
<td align="center" width="15%">PREÇO UNITÁRIO</td>
<td align="center" width="15%">Quant.</td>
<td align="center" width="15%">TOTAL</td>
<td align="center" width="15%">EXCLUIR</td>
</tr>
<tr>
       <td align='left'><font size=-1>Doce de Menta</font></td>
       <td align='center'><font size=-1>20</font></td>
       <td align='center'>R$ 3.24 </td>
       <td align='center'>
         <input style="text-align:right" type="text" id="8"  name="8" size="2" value="20" onkeypress="BloqueiaLetras();" />
         <input type="hidden" id="hd8" name="hd8" value="20" />
       </td>
       <td align='center'>R$ 64.80</td>		  
       <td align='center'><b>
       <a href="altera_carrinho.php?op=excluir&id_prod=8">Excluir</a>
       </b></td>
     </tr>

     <tr>
       <td align='left'><font size=-1>Pós de Mico Boa Sorte</font></td>
       <td align='center'><font size=-1>35</font></td>
       <td align='center'>R$ 2.33 </td>
       <td align='center'>
         <input style="text-align:right" type="text" id="7"  name="7" size="2" value="20" onkeypress="BloqueiaLetras();" />
         <input type="hidden" id="hd7" name="hd7" value="35" />
       </td>
       <td align='center'>R$ 46.60</td>		  
       <td align='center'><b>
       <a href="altera_carrinho.php?op=excluir&id_prod=7">Excluir</a>
       </b></td>
     </tr>
  <tr>
  <td align="center" bgcolor="#66FF99" colspan="7">
	    Valor Total da Nota:   R$ 111.40   </td>
</tr>
 <tr>
     <td align="center" colspan="7"> 
        <input type="button"  onclick="return valida_carrinho(this.form, 2)" value="Atualizar" name="Atualizar" WIDTH="78" HEIGHT="20" /><br>
     </td>
 </tr>  
 </table>
   </form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se entendi. Os campos com nome NÚMERO são os itens do carrinho. E os campos com o nome HDNÚMERO é tipo o que você tem em estoque, certo??

 

function valida_carrinho(form) {
   "use strict";
   var i, ln, elementos, buffer;
   buffer    = {};
   elementos = form.getElementsByTagName('input');
   function check(el) {
       if (el.type === 'hidden') {
           if (!buffer[el.name]) {
               return buffer[el.name] = el.value;
           }
           if (buffer[el.name] < el.value) {
               return null;
           }
       }
       if (!buffer[el.name]) {
           return buffer['hd' + el.name] = el.value;
       }
       if (buffer['hd' + el.name] > el.value) {
           return null;
       }
       alert ('erro');
   }
   for (i = 0, ln = elements.length; i < ln; i += 1) {
       check(elements.item(i));
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim. Para cada campo text que carrega a quantidade de itens no carrinho com id e name com números, eu crio um campo hidden que carrega a quantidade em estoque para aquele produto adicionado ao carrinho.

 

 

Daí eu comparo o estoque com a quantidade que o cliente preencheu. Se a quantidade for maior que o estoque eu barro ele, exibo o alert, coloco o foco no campo e paro a execução do código.

 

 

Detalhe: Essa numeração que forma o nome e a id do campo text, é a id do produto na base de dados{tabela mysql}

 

Então. Diante desse quadro, O código seria esse mesmo?

 

Teria como adicionar alguns comentários nele?

 

Eu entendo pouco ainda e estou tendo um pouco de dificuldades de entender teu raciocínio.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim. Para cada campo text que carrega a quantidade de itens no carrinho com id e name com números, eu crio um campo hidden que carrega a quantidade em estoque para aquele produto adicionado ao carrinho.

 

 

Daí eu comparo o estoque com a quantidade que o cliente preencheu. Se a quantidade for maior que o estoque eu barro ele, exibo o alert, coloco o foco no campo e paro a execução do código.

 

 

Detalhe: Essa numeração que forma o nome e a id do campo text, é a id do produto na base de dados{tabela mysql}

Tinha percebido, só precisava da confirmação.

 

Então. Diante desse quadro, O código seria esse mesmo?

A lógica é a mesma, haviam apenas alguns erros de sintaxe

 

Teria como adicionar alguns comentários nele?

Certamente

 

function valida_carrinho(form) {
   "use strict"; // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode
   var i, ln, elements, buffer; // As variáveis que vamos usar
   buffer    = {}; // Conforme formos passando pelos elementos, guardaremos aqui os valores
   elements  = form.getElementsByTagName('input'); // pegamos todos os input's dentro do formulário
   function check(el) {
       if (el.type === 'hidden') { // Verificamos se é o elemento de estoque
           if (!buffer[el.name]) { // Verificamos se não passamos pelo elemento correspondente
               return buffer[el.name] = el.value; // Se não passamos, armazenamos o valor
           } 
           if (buffer[el.name] <= el.value) { // Se já passamos e o valor escolhido é menor ou igual ao estoque
               return null; // Encerramos as verificações do elemento atual
           }
       } // Se não for o elemento de estoque
       if (!buffer[el.name]) { // Se não passamos pelo elemento de estoque
           return buffer['hd' + el.name] = el.value; // Guardamos o valor atual para testar depois
       } 
       if (buffer['hd' + el.name] >= el.value) { // Se já passamos e o valor em estoque é maior ou igual ao atual
           return null; // Encerramos os testes
       }
       alert ('erro'); // Todos os testes falharam, o valor escolhido é menor que o estoque.
   }
   for (i = 0, ln = elements.length; i < ln; i += 1) { // Passamos por cada elemento do formulário
       if (check(elements.item(i)) === undefined) { // Se a checagem falhar...
    return false; // Encerramos o loop por aqui
}
   }
   return true; // Tudo certo
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhorou.

 

Porem, não estou conseguindo colocar a mensagem personalizada que o meu código tinha.

 

Informando quantidade que ele adicionou no campo text e o estoque ele tem caso seja inferior e jogar o foco no campo de text realacionado a linha do erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oh meu Deus!

 

Código exige atenção. Muiiiiiiiita atenção.

 

Todos estavamos "comendo mosca".

 

form.elements é um vetor e não uma função.

 

Então, o correto seria form.elements[] e não form.elements().

 

Resolvido. O código ficou assim:

function valida_carrinho(form, itens)
{
   with (form)
{    
        j=0;
           for (var i=0; i < (itens-1)*2; i++)
 {                      
        if (elements[j].value > elements[j+1].value)
        {
         alert('Observe um dos produtos do carrinho\nVocê adicionou '+elements[j].value+' \nPorem, só tem '+ elements[j+1].value);
         elements[j].focus();
         return (false);
        }              
        j=j+2;
           }
 form.submit();
   }
}

Obrigado a todos que contribuiram com respostas e principalmente ao memebro HappyHippyHippo do forum Portugal a programar.

 

Mas fica a dúvida:

 

 

O que seria mais correto e profissional fazer.

with(form)
{
elements[]
}

Ou

form.elements[]

?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É.

 

Mas aconteceu um imprevisto.

Se houver apenas um produto no carrinho, a função não esta funcionando.

 

Tem como corrigir esse erro?

 

O botão de submit esta indo direto.

 

Resolvido!

Nova falta de atenção.

 

i < (itens-1)*2

Se tiver apenas 1 produto no carrinho, fará:

i < (1-1)*2I == i < (0)*2=0

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não.

 

Isso não esta funcionando.

 

Como é que eu conto quantos campos input type=text tem em um formulário?

 

Novamente. Lógica errada.

function valida_carrinho(form, itens)
{
 with (form)
 {
j=0;
for (var i=0; i < itens; i++)
    {                                       
 if (elements[j].value > elements[j+1].value)
 {
alert('Observe um dos produtos do carrinho\nVocê adicionou '+elements[j].value+' \nPorem, só tem '+ elements[j+1].value);
elements[j].focus();
return (false);
 }                      
j=j+2;
}
 form.submit();
 }
}

Vou acabar aprendendo JavaScript

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.