многомерный массив php подсчитывает повторяющиеся значения и добавляет соответствующие значения - PullRequest
0 голосов
/ 17 мая 2019

У меня есть массив php

Array
(
    [0] => Array
        (
            [location] => Kansas
            [kit] => Moving Kit
            [quantity] => 1
        )

[1] => Array
    (
        [location] => Louisiana
        [kit] => Anchored4Life DVD Kit
        [quantity] => 1
    )

[2] => Array
    (
        [location] => Louisiana
        [kit] => Anchored4Life DVD Kit
        [quantity] => 1
    )

[3] => Array
    (
        [location] => Louisiana
        [kit] => Anchored4Life DVD Kit
        [quantity] => 1
    )

[4] => Array
    (
        [location] => Pennsylvania
        [kit] => Anchored4Life DVD Kit
        [quantity] => 5
    )

[5] => Array
    (
        [location] => Pennsylvania
        [kit] => Welcome Kit
        [quantity] => 1
    )

)

И я хочу отсортировать их так, чтобы я получал данные в соответствии с местоположением и комплектами, а также их количеством и количеством, если наборы тоньше.

ON Louisiana Anchored4Life DVD Kit повторяется, поэтому я хотел бы знать, сколько заказов комплектов в каждом состоянии, как Louisiana Anchored4Life DVD Kit количество 3.

Я пробовал array_count_values(), но это считается только в соответствии со строками, и мне это нужно для нескольких наборов, и наборы не предопределены.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Я собирался задержаться на публикации, но потом я вижу другие ответы.

Вы говорите, группа на месте, поэтому я предполагаю, что это то, что вам нужно:
Я группирую по местоположению в ассоциативном массиве, а затем помещаю в подгруппу различные наборы, если набор уже добавлен, я суммирую количество.

foreach($arr as $sub){
    if(!isset($res[$sub['location']])){
        $res[$sub['location']][$sub['kit']] = $sub;
    }elseif(!isset($res[$sub['location']][$sub['kit']])){
        $res[$sub['location']][$sub['kit']] = $sub;
    }else{
        $res[$sub['location']][$sub['kit']]['quantity'] += $sub['quantity'];
    }
}

var_dump($res);

Возвращает:

array(3) {
  ["Kansas"]=>
  array(1) {
    ["Moving Kit"]=>
    array(3) {
      ["location"]=>
      string(6) "Kansas"
      ["kit"]=>
      string(10) "Moving Kit"
      ["quantity"]=>
      string(1) "1"
    }
  }
  ["Louisiana"]=>
  array(1) {
    ["Anchored4Life DVD Kit"]=>
    array(3) {
      ["location"]=>
      string(9) "Louisiana"
      ["kit"]=>
      string(21) "Anchored4Life DVD Kit"
      ["quantity"]=>
      int(3)
    }
  }
  ["Pennsylvania"]=>
  array(2) {
    ["Anchored4Life DVD Kit"]=>
    array(3) {
      ["location"]=>
      string(12) "Pennsylvania"
      ["kit"]=>
      string(21) "Anchored4Life DVD Kit"
      ["quantity"]=>
      string(1) "5"
    }
    ["Welcome Kit"]=>
    array(3) {
      ["location"]=>
      string(12) "Pennsylvania"
      ["kit"]=>
      string(11) "Welcome Kit"
      ["quantity"]=>
      string(1) "1"
    }
  }
}

https://3v4l.org/DgPKp

0 голосов
/ 17 мая 2019

Ваш вопрос не совсем ясен.Но я думаю, что вы хотите посчитать заказы, сгруппированные по продуктам.Я предлагаю вам создать очень простого помощника, например:

    public function getCount($items, $kitName) : int
    {
        $count = 0;
        foreach ($items as $item) {
            if ($item['kit'] === $kitName) {
                $count ++;
            }
        }

        return $count;
    }

Этот помощник получит, сколько заказов соответствует данному набору

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...