Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Vinicius Rangel 208 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Bruno Augusto 417 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Bruno Augusto 417 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Bruno Augusto 417 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 18, 2012 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
Bruno Augusto 417 Denunciar post Postado Julho 18, 2012 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
Carcleo 4 Denunciar post Postado Julho 19, 2012 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