Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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?
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!
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.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.
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.