Ir para conteúdo

POWERED BY:

Arquivado

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

marlaaragao

Valores do array modificados por variavel local no foreach

Recommended Posts

Boa noite,

Estou travada em uma questão um pouco boba, sou nova no PHP. Eu tenho um foreach num array e tenho uma variável local dentro do foreach que é mudada a cada iteração e inserida em um array externo. Exemplo resumido:

 

$produtos = array();
 
foreach ($itens as $item) {
            
            $prod = findProduto($item['id']);
            $prod->valor = $item['valor'];
            
            array_push($produtos, $prod);
            
}

Acontece que a cada iteração, os valores já adicionados no array $produtos são modificados para os novos valores de $prod. Como resolver isso? Obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá! Não entendi muito bem a situação. Você precisa comparar uma array para ver se houve mudança e então alterá-la? Se possível, poste um esquema de como é e como deve ficar caso o que aconteça.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi.

Você inicia $produtos como um array vazio. Não há valores nesse array, para que sejam alterador pelo foreach.

 

O que exatamente você quer que o programa faça? Que valores não devem ser alterados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, no caso o array $produtos inicia vazio mesmo.
A cada iteração no array de itens, eu preciso pegar o o campo id do item e procurar o objeto produto (pela funcao find(produto)). A essa entidade produto eu adiciono o valor do item da venda e então coloco no array de $produtos.

O problema é q a cada iteração os produtos inseridos anteriormente ficam iguais ao último adicionado.

$produtos = array(); //vazio

//array $itens possui $itens de uma venda buscados anteriormente
foreach ($itens as $item) {

   $prod = findProduto($item['id']); //aqui a variável $prod recebe uma entidade da tabela produto buscada pelo id do $item

   $prod->valor = $item['valor']; //aqui eu seto o valor do produto como sendo o valor do item de venda

   array_push($produtos, $prod); //aqui eu coloco o produto no array

}



eu tenho os seguintes dados no array $itens: id = 1 - valor = 110,00 / id = 2 - valor = 120,00 / id = 3 - valor = 130,00.

Na primeira iteração eu procuro os dados do produto cujo id é 1, atribuo à variavel $prod e adiciono o preço nele, e então adiciono a variável $prod ao array $produtos. Ok.

Na segunda iteração, eu procuro os dados do produto cujo id é 2, atribuo à variavel $prod e adiciono o preço nele, mas quando faço isso, o primeiro produto adicionado ao array fica igual ao segundo id = 2 e preço = 120, e na terceira iteração da mesma forma, os dois primeiros passam a ter os mesmo valores do produto 3.

No fim, o meu array $produtos, ao invés de ter 3 produtos diferentes, tem 3 produtos iguais: id = 3 e valor = 130,00.

Desculpe a falta de informação anterior.. Parece bobo mas não consigo passar disso. Os dados reais sao mais complexos um pouco, estou fazendo um relatório, mas o erro é esse.. (E os três produtos são realmente diferentes, nao tem perigo de serem iguais).

Muito obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Eu costumo colocar o id do produto em um input hidden no formulário que envia o produto e como posso colocar o preço unitário em um text e esses dois dados é tudo que eu preciso da tabela na hora da consulta, eu costumo validar mais ou menos assim:
    if(isset($_POST["btnComprar"])){

        $qtdProd = $_POST["qtd_produto"];

        if($_POST["qtd_produto"] < 1 || !is_numeric(($_POST["qtd_produto"]))){
            $qtdProd = 1;
        }

        $arrToAdd = array($_POST["cod_produto"], $_POST["desc_prod"], $_POST["preco_produto"], $qtdProd);

        $addQtd = false;

        if(!isset($_SESSION["compras"])) {
            $_SESSION["compras"] = array($arrToAdd);
        }else{
            for($i = 0; $i < count($_SESSION["compras"]); $i++){
                if($_SESSION["compras"][$i][0] == $arrToAdd[0]){
                    $addQtd = true;
                    $arrExistente = array($_SESSION["compras"][$i][0], $_SESSION["compras"][$i][1], $_SESSION["compras"][$i][2], $_SESSION["compras"][$i][3]);
                    $arrNova = array($_POST["cod_produto"], $_POST["desc_prod"], $_POST["preco_produto"], $qtdProd);
                    $_SESSION["compras"][$i] = array_replace($arrExistente, $arrNova);
                }
            }
            if($addQtd == false) {
                array_push($_SESSION["compras"], $arrToAdd);
            }
        }
    }

Nesse exemplo eu pego a quantidade. Se for menor que 1 ou não for numérico, eu igualo o valor a 1. Depois verifico se o id já consta em uma subarray dentro da array compras. Se existir, crio uma array com esses dados e outra com os dados vindo do post e então dou array_replace apenas para atualizar a quantidade de produtos. Caso não exista, incluo a array da nova compra com o push. Veja se ajuda em algo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite,

 

Após um pequeno descanso eu consegui resolver o problema adicionando 'clone' antes de passar a variavel $prod pro array $produtos. Creio que a variável estava sendo passada por referencia, então a acada iteração, quando ela mudava, os valores do array q foram passados com $prod também mudavam. Segue o codigo modificado:

$produtos = array(); //vazio

//array $itens possui $itens de uma venda buscados anteriormente
foreach ($itens as $item) {

$prod = findProduto($item['id']); 

$prod->valor = $item['valor']; 

array_push($produtos, clone $prod); //aqui eu uma cópia da variável $prod no array

}

Muito obrigada pelas respostas. Criqui Cavalera, no momento essa solução que encontrei é mais fácil pro problema do meu relatório, mas obrigada pela sugestão!

 

Vou marcar como resolvido.

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.