Группировка массивов по полю с несколькими значениями в переполнении стека

У меня проблема с попыткой сгруппировать массив с кратными значениями в php …

Учитывая массив как:

$in[] = array('year' => '2010', 'month' => '11', 'grupo' => '2', 'quantity' => 3);
$in[] = array('year' => '2010', 'month' => '11', 'grupo' => '3', 'quantity' => 4);
$in[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 4);
$in[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 4);
$in[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 3);
$in[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 3);

Я хочу получить:

$out[] = array('year' => '2010', 'month' => '11', 'grupo' => '2', 'quantity' => 3);
$out[] = array('year' => '2010', 'month' => '11', 'grupo' => '3', 'quantity' => 4);
$out[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 8);
$out[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 6);

Я пробовал что-то вроде этого:

$out = array();
foreach ($in as $row) {
if (!isset($out[$row['year']['month']['grupo']])) {
$out[$row['year']['month']['grupo']] = array(
'year' => $row['year'],
'month' => $row['month'],
'grupo' => $row['grupo'],
'quantity' => 0,
);
}
$out[$row['year']['month']['grupo']]['quantity'] += $row['quantity'];
}
$out = array_values($out);

но это не удается с 3 групповыми полями.

Если бы кто-то мог мне помочь, это было бы очень важно!

-1

Решение

Попробуй это:

$out = array();
foreach ($in as $row) {
if(! isset($out[$row['year']][$row['month']][$row['grupo']])) {
$out[$row['year']][$row['month']][$row['grupo']]=0;
}
$out[$row['year']][$row['month']][$row['grupo']] += $row['quantity'];
}
print_r($out);

Он выведет нужные значения, но в виде многомерного массива значений, а не в виде плоского массива с парами ключ => значение:

Array
(
[2010] => Array
(
[11] => Array
(
[2] => 3
[3] => 4
)

)

[2011] => Array
(
[2] => Array
(
[2] => 8
)

)

[2012] => Array
(
[3] => Array
(
[4] => 6
)

)

)

Но вы можете изменить свой массив:

$out2 = array();
foreach($out as $year => $year_array) {
foreach($year_array as $month => $month_array) {
foreach($month_array as $grupo => $quantity) {
$out2[] = array('year' => $year, 'month' => $month, 'grupo' => $grupo, 'quantity' => $quantity);
}
}
}
print_r($out2);

Это выведет:

Array
(
[0] => Array
(
[year] => 2010
[month] => 11
[grupo] => 2
[quantity] => 3
)

[1] => Array
(
[year] => 2010
[month] => 11
[grupo] => 3
[quantity] => 4
)

[2] => Array
(
[year] => 2011
[month] => 2
[grupo] => 2
[quantity] => 8
)

[3] => Array
(
[year] => 2012
[month] => 3
[grupo] => 4
[quantity] => 6
)

)
1

Другие решения

Это сохранит значения, а также даст сумму.

foreach($in as $row) {
$out[$row['year']][$row['month']][$row['grupo']]['quantity'][]  =   $row['quantity'];
$out[$row['year']][$row['month']][$row['grupo']]['sum']         =   array_sum($out[$row['year']][$row['month']][$row['grupo']]['quantity']);
}

print_r($out);

ДАЕТ

Array
(
[2010] => Array
(
[11] => Array
(
[2] => Array
(
[quantity] => Array
(
[0] => 3
)

[sum] => 3
)

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

[sum] => 4
)

)

)

[2011] => Array
(
[2] => Array
(
[2] => Array
(
[quantity] => Array
(
[0] => 4
[1] => 4
)

[sum] => 8
)

)

)

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

[sum] => 6
)

)

)

)
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector