Реорганизация массива PHP с уникальным количеством

#php #arrays #key #exists

#php #массивы #Клавиша #существует

Вопрос:

У меня есть следующий массив, который имеет идентификатор в качестве индекса, а некоторый — в качестве значения. Конечная цель — получить общее количество уникальных идентификаторов в другом массиве.

Массив
(
 [0] => Массив
 (
 [0] => Командный объект
 (
 [id] => 1
 [countStat] => 25
 )
 )
 [1] => Массив
 (
 [0] => Командный объект
 (
 [id] => 2
 [countStat] => 24
 )
 )
 [2] => Массив
 (
 [0] => Командный объект
 (
 [id] => 1
 [countStat] => 23
 )
 )
 [3] => Массив
 (
 [0] => Командный объект
 (
 [id] => 3
 [countStat] => 23
 )
 )
 [4] => Массив
 (
 [0] => Командный объект
 (
 [id] => 5
 [countStat] => 21
 )
 )
 [5] => Массив
 (
 [0] => Командный объект
 (
 [id] => 3 
 [countStat] => 21
 )
 )
 [6] => Массив
 (
 [0] => Командный объект
 (
 [id] => 5
 [countStat] => 20
 )
 )
 [7] => Массив
 (
 [0] => Командный объект
 (
 [id] => 2
 [countStat] => 20
 )
 )
)

Я хочу результат, подобный приведенному ниже.

Массив
(
 [0] => Массив
 (
 [0] => Командный объект
 (
 [id] => 1
 [countStat] => 48
 )
 )
 [1] => Массив
 (
 [0] => Командный объект
 (
 [id] => 2
 [countStat] => 44
 )
 )

 [3] => Массив
 (
 [0] => Командный объект
 (
 [id] => 3
 [countStat] => 44
 )
 )
 [4] => Массив
 (
 [0] => Командный объект
 (
 [id] => 5
 [countStat] => 41
 )
 )
)

Я потратил несколько часов на работу над этим, но не смог найти решение. Кто-нибудь, пожалуйста, может помочь?

Спасибо.

Комментарии:

1. Не могли бы вы поделиться своим кодом? что именно вы пробовали? что такое Team Object ? как вы можете получить доступ к полям «id» и «countStat»?

2. вы получаете этот массив из запроса mysql?

3. не была бы эта структура лучше? Массив ([0] => Array ( [id] => 1 [countStat] => 48 ) [1] => Массив ( [id] => 2 [countStat] => 48 ) [2] => Array ( [id] => 3 [countStat] => 48 ) ) зачем вам дополнительный слой, собираетесь ли вы разместить там другие массивы наряду с «объектом Team»?

4. @jameson2012 Да, это происходит из запроса mysql.

5. @jameson2012 Было бы неплохо удалить этот слой и выполнить вычисления, я попробую это сейчас …. и да, в конечном итоге мне придется объединить это с другими объектами team.

Ответ №1:

Похоже, вы хотите суммировать данные о количестве объектов team для похожих идентификаторов. Я создал аналогичную структуру данных, прошелся по ней циклом, чтобы сформировать временный массив, который использует идентификатор в качестве ключа, с соответствующими суммами (для последующего суммирования — моя — amount, ваша — countStats). Затем суммируйте их и воссоздайте желаемый результат.

 <?php

class Team
{
    public $id;
    public $amount;
    public function __construct($id, $amount)
    {
        $this->id     = $id;
        $this->amount = $amount;
    }
}

$input =
[
    [new Team(1, 3)],
    [new Team(1, 4)],
    [new Team(2, 5)],
    [new Team(2, 7)]
];

foreach($input as $subarray)
    $amounts[$subarray[0]->id][]=$subarray[0]->amount;

print_r($amounts);

foreach($amounts as $k => $v)
    $result[] = [new Team($k, array_sum($v))];

print_r($result);
  

Вывод:

 Array
(
    [1] => Array
        (
            [0] => 3
            [1] => 4
        )

    [2] => Array
        (
            [0] => 5
            [1] => 7
        )

)
Array
(
    [0] => Array
        (
            [0] => Team Object
                (
                    [id] => 1
                    [amount] => 7
                )

        )

    [1] => Array
        (
            [0] => Team Object
                (
                    [id] => 2
                    [amount] => 12
                )

        )

)