Как объединить 2 объекта и рассчитать его окончательные данные в php? - PullRequest
0 голосов
/ 08 декабря 2018

У меня много объектов в массиве php, как показано в примере.Я хочу получить новый похожий объект, который содержит все уникальные свойства всех объектов, если будет найдено то же свойство, то будет добавлено значение количества внутри этого свойства и объекта.

Например:

$data = array({"Browser": {
    "Chrome": {
        "amount": 1721
    },
    "Firefox": {
        "amount": 121
    }
  },
 "City": {
    "USA": {
        "amount": 2220
    },
    "China": {
        "amount": 121
    }
  },
 },
 {"Browser": {
    "UC Browser": {
        "amount": 117
    },
    "Chrome": {
        "amount": 40
    }
 },
 "City": {
    "USA": {
        "amount": 212
    },
    "UK": {
        "amount": 21
    }
   },
 });

Вывод, который я пытаюсь получить:

{
  "Browser": {
    "UC Browser": {
        "amount": 117
    },
    "Chrome": {
        "amount": 1761 //<=40 + 1721 
    },
    "Firefox": {
        "amount": 121
    }
 },
 "City": {
    "USA": {
        "amount": 2432 //<= 1721 + 212
    },
    "UK": {
        "amount": 21
    },
    "China": {
        "amount": 121
    }
  },
}

Аналогично, в массиве будет около 30 похожих объектов с такой же структурой.Я пробовал больше недели, но не смог решить эту проблему.

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете достичь своей цели, создав функцию рекурсии, которая будет суммировать amount элементов для одних и тех же клавиш, что-то вроде этого:

function amount_sum_recursive(...$arrays) {
    $result = [];
    // iterate through $arrays as it can be more than 2 root elements in the $data array 
    foreach ($arrays as $array) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                // if the $value is an array - we need to go deeper 
                $result[$key] = amount_sum_recursive($result[$key] ?? [], $value);
            } else {
                // the $value is not an array - it's `amount` key:
                // simply add current $value to the existing one in the $result array
                $result[$key] += $value;
            }
        }
    }
    return $result;
}

Тест:

$result = amount_sum_recursive(...$data);
echo json_encode($result, JSON_PRETTY_PRINT), PHP_EOL;

Вывод:

{
    "Browser": {
        "Chrome": {
            "amount": 1761
        },
        "Firefox": {
            "amount": 121
        },
        "UC Browser": {
            "amount": 117
        }
    },
    "City": {
        "USA": {
            "amount": 2432
        },
        "China": {
            "amount": 121
        },
        "UK": {
            "amount": 21
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...