2013-05-27 10 views
2

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

У меня есть следующий PHP-массив:

Array ( 
    [0] => Array ([article] => 10.499-1 [operation] => KN_KABEL [date] => 31-05-2013 [hours] => 0 [quantity] => 1) 
    [1] => Array ([article] => 10.499-1 [operation] => LAS_LABEL [date] => 31-05-2013 [hours] => 0 [quantity] => 1) 
    [2] => Array ([article] => 10.499-1 [operation] => ASS_HARNES [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [3] => Array ([article] => 10.499-1 [operation] => CONTROLE [date] => 07-06-2013 [hours] => 0 [quantity] => 1) 
    [4] => Array ([article] => 24.030 [operation] => LAS_LABEL [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [5] => Array ([article] => 24.030 [operation] => ZAGEN-RAIL [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [6] => Array ([article] => 24.030 [operation] => KN_KABEL [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [7] => Array ([article] => 24.030 [operation] => ASS_RAIL [date] => 05-06-2013 [hours] => 0 [quantity] => 1) 
    [8] => Array ([article] => 791 070-6/GS/P [operation] => GS_UNIT [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [9] => Array ([article] => 791 070-6/GS/P [operation] => PR_UNIT [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [10] => Array ([article] => 791 070-6/GS/P [operation] => LAS_LABEL [date] => 04-06-2013 [hours] => 0 [quantity] => 1) 
    [11] => Array ([article] => ESS-0834E/LE-CD200 [operation] => MAGAZIJN [date] => 10-06-2013 [hours] => 0 [quantity] => 1) 
    [12] => Array ([article] => ESS-0834E/LE-CD200 [operation] => PR_UNIT [date] => 11-06-2013 [hours] => 0 [quantity] => 1) 
    [13] => Array ([article] => ESS-0834E/LE-CD200 [operation] => LAB_PLAKKE [date] => 11-06-2013 [hours] => 0 [quantity] => 1) 
) 

То, что я пытаюсь сделать, это рассчитывать на каждую дату (ключ «геодезический») сумму часов (в данном примере они все 0, но я все еще хочу это сделать, потому что это изменится в будущем). То, что было бы очень практично, - это сделать такой запрос, как sql, например, SELECT SUM(hours) GROUP BY date, но это, к сожалению, не SQL.

Есть ли способ группировать (и заказывать) мой массив по определенному ключу (в данном случае «дате») или, если нет, есть ли другой способ получить результат, что я хочу?

EDIT

Недавно я добавил ключ «отдел», который должен быть сгруппированы по к. Таким образом, я не только хочу подсчитывать сумму «часов», но и «количество»

ответ

2

Просто создайте просто foreach для этого.

$arr = array(); 

$sums = array(); 
foreach($arr as $k=>$v) 
{ 
    if(!isset($sums[$v['date']][$v['department']]['hours'])) $sums[$v['date']][$v['department']]['hours'] = 0; 
    if(!isset($sums[$v['date']][$v['department']]['quantity'])) $sums[$v['date']][$v['department']]['quantity'] = 0; 
    $sums[$v['date']][$v['department']]['hours'] += $v['hours']; 
    $sums[$v['date']][$v['department']]['quantity'] += $v['quantity']; 
} 
print_r($sums); 

он будет создавать массив $sum, где ключи являются вашими датами. Если значение не существует, оно добавит значение часов в 0, иначе, если оно существует, оно добавит к существующему значению.

редактировать

Монтажн потребностям ОП.

+0

это действительно полезно для меня, спасибо! 2 вопроса? Я добавил ключевой «отдел» в свой массив. Также возможно «группировать» по 2 столбца. И второе: я тоже хочу подсчитать ключевое «количество». Можно ли сделать это в том же коде? Извините, что не заметил этого в моем вопросе. Я отредактирую свой вопрос с дополнительными требованиями – Jovano

+0

, конечно, возможно '$ sums [$ v ['date']] [$ v ['department']]' small change, и это работает :) количество может быть засчитано на то же самое;) $ sums [$ v ['date']] [$ v ['department']] значение массива может быть также массивом, где вы можете поместить часы и количество и суммировать его. – Robert

+0

Я редактировал код. Синтаксис, который вы написали, недействителен. – Robert

Смежные вопросы