Как создать собственный массив в многоуровневом foreach?

0

Вот исходные данные

Array
(
    [name] => me
    [tickets] => Array
        (
            [1] => Array
                (
                    [equipment] => Array
                        (
                            [1] => Array
                                (
                                    [name] => DVR
                                    [received] => 10
                                )
                            [2] => Array
                                (
                                    [name] => DCT
                                    [received] => 3
                                )
                        )
                )
            [2] => Array
                (
                    [equipment] => Array
                        (
                            [1] => Array
                                (
                                    [name] => DVR
                                    [received] => 4
                                )
                            [2] => Array
                                (
                                    [name] => DCT
                                    [received] => 6
                                )
                        )
                )
        )
)

У пользователей есть несколько билетов, но каждый билет имеет один и тот же элемент с разными "полученными" суммами. Я хотел бы sum полученную сумму в одну переменную/массив.

Вот демонстрация того, как я хотел бы заставить его работать как

Array
(
    [name] => me
    [equipment] => Array
        (
            [DVR] => 14
            [DCT] => 9
        )
)

Вот моя недавняя неудачная попытка построить мой собственный массив из многомерного массива.

foreach($data as $user){
    $sum = [];
    $sum['name'] = $user->name;
    $sum['equipment'] = [];
    foreach($user->tickets as $ticket){
        foreach($ticket->equipments as $eqpt){
            $sum['equipment'][$eqpt['name']] += $eqpt['pivot']['received'];
        }
    }
    print_r($sum);
}
  • 0
    Не могли бы вы сделать свой пример более лаконичным?
  • 0
    @tsnorri - я очистил свой код, чтобы сделать его более читабельным. Я хочу получить сумму всего оборудования по всем тикетам в коллекции для этого пользователя в новый, чистый массив.
Показать ещё 1 комментарий
Теги:
arrays
multidimensional-array
foreach

3 ответа

0

ну, после многих поисковых запросов и проб и ошибок, похоже, это работает

$sum = [];
// $data is a collection returned by Laravel
// I am converting it to an array
foreach($data->toArray() as $user){
    $items = [];
    foreach($user['tickets'] as $ticket){
        foreach($ticket['equipments'] as $eqpt){
            $name = $eqpt['name'];

            if (! isset($items[$name]))
            {
                $items[$name] = $eqpt['received'];
            } else {
                $items[$name] += $eqpt['received'];
            }
        }
    }
    $sum[] = [
        'name' => $user['name'],
        'equipment' => $items
    ];
}

@tsnorri @Adrian Cid Almaguer

  • 0
    вы пытаетесь с моим ответом?
0

Попробуйте следующее:

$array = $data; //$data is your array

$sum = array('name' => $array['name'], 'equipment' => array());

foreach($array['tickets'] as $row) {
  for($i = 0; $i < count($row); $i++) {
      foreach($row['equipment'] as $infos) {
        $sum['equipment'][$infos['name']] += $infos['received'];
        //print_r($infos);
    }     
  }       
}   

print_r($sum);
0

Пожалуйста, попробуйте следующий код. Однако в ваших $data есть только один пользователь, поэтому вам нужно сделать $data = [$data]; первый.

foreach ($data as $user) {
    $sum = [];
    $sum['name'] = $user['name'];
    $sum['equipment'] = [];
    foreach($user['tickets'] as $ticket){
        foreach($ticket['equipment'] as $eqpt){
            $sum['equipment'][$eqpt['name']] += $eqpt['received'];
        }
    }
    print_r($sum);
}
  • 0
    эта точка была оставлена там по ошибке, это фактический уровень в массиве для среды. Я получаю ошибку: Undefined index: DVR

Ещё вопросы

Сообщество Overcoder
Наверх
Меню