считая массив данных - PullRequest
1 голос
/ 24 марта 2011

Мне нужно 4 таких ассоциативных массива с теми же 4 пользователями

Array ( [0] => Array ( [userName] => jim [count] => 6 ) [1] => Array ( [userName] => joe [count] => 6 ) [2] => Array ( [userName] => jesse [count] => 36 ) [3] => Array ( [userName] => mark [count] => 2 ) ) 


Array ( [0] => Array ( [userName] => jim [count] => 2 ) [1] => Array ( [userName] => jesse [count] => 2 ) [2] => Array ( [userName] => mark [count] => 16 ) ) 


Array ( [0] => Array ( [userName] => jim [count] => 8 ) ) 


Array ( )

Давайте просто скажем, что они названы

$values1
$values2
$values3
$values4

у них могут быть все 4 пользователя, и они могут не иметь ни одного, или только некоторые

Мне нужно суммировать все значения и иметь один массив, подобный этому

 $people = array(
    array("name" => "jim", "score" => 33), 
    array("name" => "jesse", "score" => 44),
    array("name" => "mark", "score" => 66),
    array("name" => "joe", "score" => 11)
 );

есть простой способ добавить эти значения и сопоставить один массив со всеми добавленными данными

Я уверен, что смогу понять это методом грубой силы, но мне было интересно, есть ли чистый способ сделать это

Ответы [ 4 ]

2 голосов
/ 24 марта 2011

Вот третий вариант, заключенный в формат функции.; -)

// tally_counts($score1, $scores2[, $score3[, ...]])
function tally_counts(){
  $result = array();
  foreach (func_get_args() as $counts){
    foreach ($counts as $count){
      if (!array_key_exists($count['userName'],$result)){
        $result[$count['userName']] = array(
          'name'  => $count['userName'],
          'count' => $count['count']
        );
      }else{
        $result[$count['userName']]['count'] += $count['count'];
      }
    }
  }
  return array_values($result);
}

DEMO

1 голос
/ 24 марта 2011

Я думаю, это то, что вы хотите увидеть в действии на http://www.oriontechnologysolutions.com/stackoverflow/arraycount.php:

$list1 = Array (Array ( 'userName' => 'jim', 'count' => 6 ),Array ( 'userName' => 'joe' , 'count' => 6 ), Array ( 'userName' => 'jesse', 'count' => 36 ), Array ( 'userName' => 'mark' , 'count' => 2 ) ) ;
$list2 = Array (Array ( 'userName' => 'jim' , 'count' => 2 ), Array ( 'userName' => 'jesse' , 'count' => 2 ), Array ( 'userName' => 'mark' , 'count' => 16 ) ) ;
$list3 = Array (Array ( 'userName' => 'jim', 'count' => 8 ) ) ;
$list4 = Array ( );


$master_list = Array($list1, $list2, $list3, $list4);
$final = Array();
foreach($master_list as $glist) {
        foreach($glist as $person) {
                if(!isset($final[$person['userName']]))
                        $final[$person['userName']] = 0;
                $final[$person['userName']] += $person['count'];
        }
}
print_r($final);
1 голос
/ 24 марта 2011

вы можете сделать это:

$people = array();

foreach(array_merge($values1, $values2, $values3, $values4) as $k=>$v){
   if(isset($people[$v['username']]){
        $people[$v['username']]['score'] += $v['count'];
   }
   else {
       $people[$v['username']] = array();
       $people[$v['username']]['score'] = $v['count']; 
   }
}

Это даст вам такой результат:

$people = array(
    "jim" => array("score" => 33), 
    "jesse" => array("score" => 44),
    "mark" => array("score" => 66),
    "joe" => array("score" => 11)
 );
1 голос
/ 24 марта 2011

Самый простой способ - создать массив с такой структурой:

$people = array(
    'jim' => 33,
    'jess' => 44
    // ...
);

Этот массив можно создать с помощью следующего цикла:

$people = array();

foreach(array_merge($values1, $values2, $values3, $values4) as $person) {
    $name = $person['name'];
    if(!isset($people[$name])) {
        $people[$name] = 0;
    }
    $people[$name] += $person['score'];
}

С этого момента либо используйтеэту структуру напрямую или конвертируйте в нужный формат.

...