Ir para conteúdo

POWERED BY:

Arquivado

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

Carcleo

[Resolvido] foreach

Recommended Posts

Pessoal, tenho o array abaixo que é a sessão de um carrinho de compras.

TCarrinho Object
(
   [item_codigo] => Array
       (
           [0] => 1
           [1] => 3
       )

   [item_quantidade] => Array
       (
           [0] => 1
           [1] => 3
       )

   [item_peso] => Array
       (
           [0] => 3.24
           [1] => 2.34
       )

)

Preciso fazer uma coração no webservice dos correios para cada produto. Dái, queria pedir a opinião de vocês de como eu poderia fazer isso.

 

O script do webservice eu já tenho. Anteriormente eu estava somando o peso total e fazendo a consulta de frete do pacote inteiro. Só que agora, vai ter produto que não terá frete e outro terá. Portanto, preciso calular a somatria de todos os fretes.

 

Como eu poderia fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você precisa ter alguma identificação do produto para saber se ele tem frete ou não

 

$frete = 0;
if($frete == true){
//verifica peso e guarda em uma variavel
$frete = soma;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei la o array.

 

Eu poderia adicionar, no carrinho, a informação se o frete para aquele produto é ou nao gratis.

 

Minha dificuldade não é com a validaçao, mas sim, com o foreach para verificar o frete em cada um.

 

Ficou assim:


TCarrinho Object
(
   [item_codigo] => Array
       (
           [0] => 1
           [1] => 3
       )

   [item_quantidade] => Array
       (
           [0] => 1
           [1] => 3
       )

   [item_peso] => Array
       (
           [0] => 3.24
           [1] => 1.25
       )

   [frete_gratis] => Array
       (
           [0] => s
           [1] => s
       )

)

A ideia é seguinte:

Para cada codigo do artay, se o item frete_gatis for sim, calcula o frete

Array [item_codigo] 1 se [frete_gratis]==s calcula frete

Array [item_codigo] 2 se [frete_gratis]==s calcula frete

 

Como fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria diferente.

 

Com uma estrutura como essa:

 

$items = array(

   array(

       'id' => 1, 'amount' => 1, 'weight' => 3.24, 'freight' => FALSE
   ),

   array(

       'id' => 3, 'amount' => 3, 'weight' => 1.25, 'freight' => FALSE
   ),

   array(

       'id' => 4, 'amount' => 5, 'weight' => 2.4, 'freight' => TRUE
   )
);

Você poderia fazer de forma bastante legível um loop assim:

 

$freight = 0;

foreach( $items as $item ) {

   if( $item['freight'] !== FALSE ) {

       // Formula Falsa

       $freight += ( $item['weight'] * $item['amount'] ) * 0.5;
   }
}

Nesse exemplo a variável $freight armazena o valor 6 referente 50% do peso do último item multiplicado pela sua quantidade.

 

Os outros, como possuem o índice freight setado como FALSE, não serão incluídos na soma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas a dificuldade que estou tendo é exatamente essa.

 

A estrutura que eu tenho (MeuCarrinho) não igual a essa que voce postou e não estou conseguindo fazer dela um array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, tentei assim:

foreach($_SESSION["MeuCarrinho"] as $key => $value) 
{
 print "$key => $value\n";
}

Saiu assim:

item_codigo => Array
item_quantidade => Array
item_peso => Array
item_frete_gratis => Array

Daí tentei do jeito abaixo para imprimir tambem o array de cada item mas da erro no foreach de dentro

foreach($_SESSION["MeuCarrinho"] as $key => $value) 
{
 foreach($key as $key2 => $value2) 
 {
  print "$key2 => $value2\n";
 }
}

Esse é o erro que dá:

Warning: Invalid argument supplied for foreach() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\frete.php on line 14

Warning: Invalid argument supplied for foreach() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\frete.php on line 14

Warning: Invalid argument supplied for foreach() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\frete.php on line 14

Warning: Invalid argument supplied for foreach() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\frete.php on line 14

E agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo que eu preciso saber é o seguinte:

 

São dois produtos nesse array.

 

Eles tem 4 atributos garvados no array: codigo, quantidade, peso, frete_gratis.

 

A validação é a seguinte:

 

Se o item com o primeiro codigo sa lista, seu frete for gratis, pega a quantidade e multiplica pelo peso e envia esses valores para o correio.

 

Essa é a dificuldade.

 

alguém ajuda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mude o HTML então.

 

Se você fizer ele mais ou menos assim:

 

<input type="text" name=item[<?php echo $item -> id; ?>]['amount'] />

<input type="text" name=item[<?php echo $item -> id; ?>]['weight']
   value="<?php echo $item -> weight; ?>" />

<input type="hidden" name=item[<?php echo $item -> id; ?>]['freight']
   value="<?php echo $item -> freight; ?>" />

Vai receber no $_POST algo parecido com a estrutura que eu postei. A diferença é que não haverá o índice id pois o ID do produto será o índice do array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certa vez, consegui reverter uma situação parecida fazendo com que um array com a estrutura da minha, virasse um array filtrado parecido com a estrutura da tua.

Tentei agora mas retorna array vazio.

Veja:

function filtrar_array_por_valor($array, $index, $value) 
{
  $newarray= array();
  if(is_array($array) && count($array) > 0) {
    foreach(array_keys($array) as $key) {
      $temp[$key] = $array[$key][$index];

     if ($temp[$key] == $value) {
        $newarray[$key] = $array[$key];
      }
    }
  }
  return $newarray;
}
print_r(filtrar_array_por_valor($_SESSION["MeuCarrinho"],"item_frete_gratis","s"));

Mas ele diz que aquela array (object carrinho) não é array

Compartilhar este post


Link para o post
Compartilhar em outros sites

Array é Array, objeto é objeto e essa função só trabalha com arrays.

 

Existem duas soluções

 

1. Implementar a interface Iterator e ArrayAccess na classe TCarrinho, assim esse foreach conseguirá iterar também este objeto mesmo que esteja usando a sintaxe de colchetes ao invés do operador -> de uma propriedade de objeto.

 

2. Forçar o cast do objeto para array. Uma vez que seu objeto é bem simples e tem todos os índices como um array, fazer:

 

$array = (array) $obj;

"Transformará" aque TCarrinho Object em Array

 

Lógico e evidente que a segunda opção é apenas um paliativo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas hein Bruno.

 

Acho que consegui.

 

Fiz assim. E, pelo que parece, esta dando certo.


$total_frete=0.00;

for($i=0; $i<$_SESSION["MeuCarrinho"]->QuantosItens(); $i++)
{
  if($_SESSION["MeuCarrinho"]->item_frete_gratis[$i]=="s")
 {
  $peso_produto =$_SESSION["MeuCarrinho"]->item_quantidade[$i] * $_SESSION["MeuCarrinho"]->item_peso[$i];
  include ('frete.php');
 }
}

O que você me diz?

Devo prosseguir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas hein Bruno.

Até onde eu sei, até antes de os Iterators serem criados, apenas arrays podiam ser iterados com foreach, for e etc.

 

Então, pelo visto, a grosso modo, surgiu a necessidade de se iterar objetos que por si só não são iteráveis.

 

Quando o seu objeto implementa a interface Iterator ele obrigatoriamente passa a ter os métodos current(), key(), next(), rewind() e valid().

 

Ao implementar tais métodos no seu objeto você permite que o mesmo "funcione", por exemplo, dentro de um foreach como se fosse um array.

 

Mas existe outro problema: A sintaxe!

 

Enquanto os índices de um array são acessados através de colchetes, as propriedades dos objetos são através do operador -> (o qual nunca descobri o nome desse infeliz <_<).

 

Sendo assim, tarefas aplicáveis sobre arrays, até então os únicos iteráveis, não podiam ser aplicadas sobre essa nova classe da população. E com isso surgiu a interface ArrayAccess.

 

Ao implementar essa interface os objetos passam a ter outros quatro métodos que, depois de implementados, permitem que ao objeto ser acessado e manipulado também através da sintaxe de colchetes.

 

Por isso que eu disse que a solução ideal, já que a estrutura não aparenta poder ser alterada, seria implementar ambas as interfaces para que seu objeto tenha as mesmas capacidades de um array, e com isso permitir que você usasse aquela função.

 

O que você me diz?

Devo prosseguir?

Isso só você pode dizer.

 

Funcionou? Ótimo.

 

Funcionou sem usar aquela função que modifica a estrutura do array? Melhor ainda! Não está gastando performance à toa e nem contornando problemas.

 

Agora é com você. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece o seguinte: Eu não cheguei a fazer curso algum ainda.

 

Comecei esse um Tecnólogo à distancia em sistemas de Computação e também tem pouco tempo de programação.

 

Como eu faço? Pego um sistema e vou pesquisando na net. Quando não acha nada nem depois muito tempo quebrando cabeça não consigo, daí recorro ao fórum. Mas, ultimamente parece que minhas duvidas tem ficado mais difíceis.

 

Agradeço a todos.

 

Vou ter que estudar essa declaração tua Bruno. Me pareceu bastante interessante e segura.

 

Mas, por enquanto, por questões de tempo, vou ficar com a forma que eu consegui fazer (e entender o funcionamento).

 

Segue como ficou:

$total_frete=0.00;

for($i=0; $i<$_SESSION["MeuCarrinho"]->QuantosItens(); $i++)
{
  if($_SESSION["MeuCarrinho"]->item_frete_gratis[$i]=="s")
 {
  $peso_produto =$_SESSION["MeuCarrinho"]->item_quantidade[$i] * $_SESSION["MeuCarrinho"]->item_peso[$i];
  include ('frete.php');
 }
}
   $valor_final = $total_frete + $_SESSION["preco_total"];
include ('form_fechamento.php');

Obrigado a todos que ajudaram.

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.