2010-09-17 3 views
1

Мне нужна помощь, если кто-то будет достаточно любезен, чтобы помочь.Цитирование по массиву и итоговые значения

У меня есть массив со значениями, которые я хочу пропустить, и если какое-либо из значений «user_id» одинаково, то суммировать значение «max_score» для идентификатора дубликата пользователя.

 
Array 
(
    [0] => Array 
     (
      [user_id] => 2 
      [max_score] => 10081 
     ) 

    [1] => Array 
     (
      [user_id] => 1 
      [max_score] => 8774 
     ) 

    [2] => Array 
     (
      [user_id] => 2 
      [max_score] => 5477 
     ) 

    [3] => Array 
     (
      [user_id] => 3 
      [max_score] => 5267 
     ) 

    [4] => Array 
     (
      [user_id] => 1 
      [max_score] => 5010 
     ) 
) 

Кто-нибудь знает, как это осуществить?

Большое спасибо.

ответ

1

Вам нужен второй массив с идентификаторами пользователя в качестве ключа. Вы можете сделать это следующим образом:

$scoresums = array(); 
foreach ($yourarray AS $user_score) { 
    if (!isset($scoresums[$user_score['user_id']])) $scoresums[$user_score['user_id']] = 0; 
    $scoresums[$user_score['user_id']] += $user_score['max_score']; 
} 

Третья строка предотвратит выдачу уведомлений php.

+0

-1 это будет выдавать уведомления. – NikiC

+0

вы можете исправить это, добавив строку «if (! Isset ($ scoresums [$ user_score ['user_id]])) $ scoresums [$ user_score [' user_id ']] = 0;" в первой строке цикла. – Thomas

+1

Вау - вы, ребята, потрясающие, работает блестяще, спасибо. Теперь, когда у меня есть общий балл, есть ли способ заказать значение определенного ключа по убыванию? – Sibbels

4
$totals = array(); 
foreach ($your_array_values as $v) { 
    $id = $v['user_id']; 
    if (isset($totals[$id])) { 
     $totals[$id] += $v['max_score']; 
    } else { 
     $totals[$id] = $v['max_score']; 
    } 
} 
+0

Если вы исправите цикл for (это цикл foreach) и придерживаетесь некоторых стандартов кодирования, вы получите мой голос. – NikiC

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