Sum 2 arrays with equal indices

Asked

Viewed 1,301 times

1

I have an array in a $_SESSION['Carrinho']:

Array ( [0] => Array ( [Produto] => ENH1264-1 
                       [Quantidade] => 2 ) 
        [1] => Array ( [Produto] => ENH1264-2 
                       [Quantidade] => 3 ) 
        [2] => Array ( [Produto] => ENH1264-6 
                       [Quantidade] => 1 ) 
      )

I would like to add new values to this array. I have this second array:

Array ( [0] => Array ( [Produto] => ENH1264-6 
                       [Quantidade] => 5 ) 
        [1] => Array ( [Produto] => ENH1264-1 
                       [Quantidade] => 8 ) 
      )

Is there any way, without going out doing several foreach comparing the results, generating new arrays? Some simplified way?

The expected result would be:

Array ( 
    [0] => Array ( 
        [Produto] => ENH1264-1 
        [Quantidade] => 10 
    ) 
    [1] => Array ( 
        [Produto] => ENH1264-2 
        [Quantidade] => 3
    ) 
    [2] => Array ( 
        [Produto] => ENH1264-6 
        [Quantidade] => 6
    ) 
)

see that the products that are equal had their quantities added up. If in the second array there is a product you do not have in the first, add as new index.

  • 2

    What is the expected result? You can ask the question?

  • @Andersoncarloswoss made!

  • 1

    So what you want is not to add elements with equal indexes, as the title says, but to add the items of the same name in Produto?

  • would be just that! If you have the same value in the index "product", add the Index "quantity"!

2 answers

2


If you want something simple you can base it on array_map to map an array of products in their names and then search the product with array_search. If you find the product updates the quantity, otherwise you add a new entry to the array.

Example of implementation of the logic described above:

$obterProduto = function($p) { return $p["Produto"]; };

foreach ($compras as $compra){
    $posicao = array_search($compra["Produto"], array_map($obterProduto, $produtos));
    if ($posicao === false){ //se não existe adiciona
        $produtos[] = $compra;
    }
    else { //se existe aumenta apenas a quantidade
        $produtos[$posicao]["Quantidade"] += $compra["Quantidade"]; 
    }
}

See code working on Ideone

  • Isac, I tried this way and it worked perfectly! :)

-1

from what I understand it is possible to do so too:

<?php

/*Obtendo Produto via POST e armazendo em array.*/
$Dados = array([Produto] => $_POST['produto'], 
               [Quantidade] => $_POST['quantidade']);

/*Se o Carrinho ainda não foi configurado, adicione os dados a ele.*/
if (!isset($_SESSION['Carrinho']){
    $_SESSION['Carrinho'] = array($Dados);
}
else{
    /*Senao verifique se já existe o produto dentro dele.*/
    if(in_array($Dados['Produto'], $_SESSION['Carrinho']){

        /*Se existe percorra o carrinho, encontre e acumule a quantidade*/
        foreach($_SESSION['Carrinho'] as $multi){
            $multi[quantidade] += $Dados['Quantidade']
        }
    }
    /*se o produto é novo adicione ele no proximo indice do carrinho*/
    else{
        $_SESSION['Carrinho'] = array_fill(count(Dados['Produto']), 1, $Dados);
    }
}

/*Limpa o array DADOS*/
unset($Dados);

?>
  • Why vote against a simple answer? What’s wrong?

  • Apart from the wrong syntax, logic does not make sense in some points: for example, Dados['Produto'] = array($Dados), why store $Dados in itself? If it was defined as array, why convert to array?

  • nor noticed the question of Data['Product'] = array($Data), more I fixed. I just edited

  • Now all that remains is to test and correct syntax errors.

  • which syntax is incorrect?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.