Compare array using 2 values

Asked

Viewed 63 times

0

I need to create a product array using another product array.

In the first array there is the same product several times, whereas the second need to insert only the products when they do not repeat. If repeat I have to add up the amount of product.

Another important detail is that the product uses 2 keys to identify, product and size. My Question is how to do this existeProdutoNoArray2.

$produtos1 = array(
       array('produto'=>1,'tamanho'=>20,'quantidade'=>2)
       array('produto'=>1,'tamanho'=>21,'quantidade'=>3)
       array('produto'=>1,'tamanho'=>22,'quantidade'=>5)
       array('produto'=>3,'tamanho'=>20,'quantidade'=>1)
       array('produto'=>3,'tamanho'=>21,'quantidade'=>1)
       array('produto'=>3,'tamanho'=>22,'quantidade'=>2)
       array('produto'=>1,'tamanho'=>20,'quantidade'=>3)
       array('produto'=>1,'tamanho'=>21,'quantidade'=>1)
       array('produto'=>1,'tamanho'=>22,'quantidade'=>2)
);

$produtos2 = array();
foreach ($produtos1 as $key => $produto) {
      if(existeProdutoNoArray2){

      }else{
      $produtoTam = array('produto'=>$produto['produto'],'tamanho'=>$produto['tamanho'],'quantidade'=>$produto['quantidade']);
      array_push($produtos2,$produtoTam);
      }
}

I tried to use the in_array thus:

in_array(array($produto['produto'],$produto['quantidade']),
array_column($produtos2,array('produto','tamanho'))

But it didn’t work because it looks like in_array accepts only 1 parameter. The result should be like this:

$produtos2 = array(
           array('produto'=>1,'tamanho'=>20,'quantidade'=>5)
           array('produto'=>1,'tamanho'=>21,'quantidade'=>4)
           array('produto'=>1,'tamanho'=>22,'quantidade'=>7)
           array('produto'=>3,'tamanho'=>20,'quantidade'=>1)
           array('produto'=>3,'tamanho'=>21,'quantidade'=>1)
           array('produto'=>3,'tamanho'=>22,'quantidade'=>2)
    );
  • You could put examples of the array you have?

  • I edited the question by putting an example.

1 answer

3


The simplest is to generate an associative array using as a key an index that is equivalent among the items you need to accumulate. As you want to accumulate quantities based on product and size, just generate a key that uses these last two values:

$produtos2 = [];

foreach ($produtos1 as $produto) {
  $indice = "{$produto['produto']}-{$produto['tamanho']}";

  if (!isset($produtos2[$indice])) {
    $produtos2[$indice] = $produto;
    continue;
  }

  $produtos2[$indice]["quantidade"] += $produto["quantidade"];
}

$produtos2 = array_values($produtos2);

So the result will be:

array (
  0 =>
  array (
    'produto' => 1,
    'tamanho' => 20,
    'quantidade' => 5,
  ),
  1 =>
  array (
    'produto' => 1,
    'tamanho' => 21,
    'quantidade' => 4,
  ),
  2 =>
  array (
    'produto' => 1,
    'tamanho' => 22,
    'quantidade' => 7,
  ),
  3 =>
  array (
    'produto' => 3,
    'tamanho' => 20,
    'quantidade' => 1,
  ),
  4 =>
  array (
    'produto' => 3,
    'tamanho' => 21,
    'quantidade' => 1,
  ),
  5 =>
  array (
    'produto' => 3,
    'tamanho' => 22,
    'quantidade' => 2,
  ),
)

See working on Repl.it

  • It came right with what I need. Thank you

Browser other questions tagged

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