Группировать данные по месяцам в массиве php

У меня есть 2 таких массива:

Массив дней

Array (
    [0] => 2018-01-01
    [1] => 2018-02-04
    [2] => 2018-02-15
    [3] => 2018-04-06
    [4] => 2018-04-12
    [5] => 2018-04-19
    [6] => 2018-04-27
    [7] => 2018-07-08
    [8] => 2018-08-12
    [9] => 2018-08-11
    [10] => 2018-08-21
    [11] => 2018-10-12
    [12] => 2018-10-13
    [13] => 2018-10-14
    [14] => 2018-10-15
    [15] => 2018-11-06
    [16] => 2018-12-12
    [17] => 2018-12-28
)

Массив данных

Array (
    [0] => 4
    [1] => 2
    [2] => 3
    [3] => 2
    [4] => 2
    [5] => 9
    [6] => 7
    [7] => 8
    [8] => 12
    [9] => 21
    [10] => 1
    [11] => 2
    [12] => 13
    [13] => 4
    [14] => 15
    [15] => 6
    [16] => 2
    [17] => 8
)

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

Ожидаемый результат - это один такой массив:

Array (
    [0] => Array ( [month] => 01 [data] => 4) 
    [1] => Array ( [month] => 02 [data] => 5) /* 2 + 3 = 5 */
    ...
    ...
)

Или два массива: один для месяцев и один для данных.

Это не дубликат. Этот ответ работает, только если в месяцах несколько раз есть только первый день. К тому же это очень сложно.

Что ты уже испробовал ?

Jules R 18.12.2018 16:14

Возможный дубликат Многомерный массив - Группировка по месяцам

Masivuye Cokile 18.12.2018 16:15

@JulesR, я уже ищу, я не нашел ничего для начала, я думаю, что могу получить месяц с даты, и мне также нужно перебирать цикл, но я не совсем уверен.

Luca Antonelli 18.12.2018 16:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
1 341
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

<?php
$arr1 = array ('2018-01-01', '2018-02-04', '2018-02-15', '2018-04-06', '2018-04-12', '2018-04-19', '2018-04-27', '2018-07-08', '2018-08-12', '2018-08-11', '2018-08-21', '2018-10-12', '2018-10-13', '2018-10-14', '2018-10-15', '2018-11-06', '2018-12-12', '2018-12-28');

$arr2 = array(4, 2, 3, 2, 2, 9, 7, 8, 12, 21, 1, 2, 13, 4, 15, 6, 2, 8);


$count1 = count($arr1);
$count2 = count($arr2);
$new_arr = array();

while($count1 > 0 and $count2 > 0){
    $count1--;
    $count2--;
    $data = $arr2[$count2];
    $month = $arr1[$count1];
    $month = explode("-", $month);
    $month = $month[1];
    $new_arr[] = ['month' => $month, 'data' => $data];
}

print_r($new_arr);

Вы можете проверить это здесь: http://sandbox.onlinephpfunctions.com/code/bbf06c48b7242a8d3575610e0cec3ef378e84c4b

Обновлено:

<?php
$arr1 = array ('2018-01-01', '2018-02-04', '2018-02-15', '2018-04-06', '2018-04-12', '2018-04-19', '2018-04-27', '2018-07-08', '2018-08-12', '2018-08-11', '2018-08-21', '2018-10-12', '2018-10-13', '2018-10-14', '2018-10-15', '2018-11-06', '2018-12-12', '2018-12-28');

$arr2 = array(4, 2, 3, 2, 2, 9, 7, 8, 12, 21, 1, 2, 13, 4, 15, 6, 2, 8);


$count1 = count($arr1);
$count2 = count($arr2);
$new_arr = array();

while($count1 > 0 and $count2 > 0){
    $count1--;
    $count2--;
    $data = $arr2[$count2];
    $month = $arr1[$count1];
    $month = explode("-", $month);
    $month = $month[1];
    $new_arr[] = ['month' => $month, 'data' => $data];
}

$temp = [];
foreach($new_arr as $value) {
    if (!array_key_exists($value['month'], $temp)) {
        $temp[$value['month']] = 0;
    }
    $temp[$value['month']] += $value['data'];
}

print_r($temp);

Вы можете проверить это здесь: http://sandbox.onlinephpfunctions.com/code/7178c298da8422cf1e8f23ee230adece5999a914

Это соответствует только дням с данными, мне нужно только 12 месяцев (или существующих) с суммой данных того же месяца.

Luca Antonelli 18.12.2018 16:35

Спасибо, это работает, я сам нашел другое решение и опубликую его, но я приму ваш ответ о помощи! :)

Luca Antonelli 18.12.2018 16:50

Это мое другое решение:

$array = array();
$var = -1;
$i = 0;

foreach($timestamp as $date) {
    $months = date("F", strtotime($date));
    if (!isset($temp) || $months != $temp) {
        ++$var;
        $array[$var]['data'] = $data[$i];
        $array[$var]['month'] = $months;
        ++$i;
    }
    else {
        $array[$var]['data'] = $array[$var]['data'] + $data[$i];
        ++$i;
    }
    $temp = $months;
}

Другие вопросы по теме