Многомерный массив PHP Group?

#php #arrays #multidimensional-array

#php #массивы #многомерный-массив

Вопрос:

 $arr = Array
    (
    Array(
            "id" => "1",
            "player_name" => "Jack",
            "type" => "Arcades",
            "high_score"=> "10000",
            "score"=> "500",
        ),
    Array(
            "id" => "1",
            "player_name" => "Jack",
            "type" => "Racing",
            "high_score"=> "12000",
            "score"=> "700",
        ),
    Array(
            "id" => "2",
            "player_name" => "Steve",
            "type" => "Racing",
            "high_score"=> "10000",
            "score"=> "400",
        ),
    Array(
            "id" => "2",
            "player_name" => "Steve",
            "type" => "Arcades",
            "high_score"=> "12000",
            "score"=> "600",
        ),
    Array(
            "id" => "2",
            "player_name" => "Steve",
            "type" => "Casual",
            "high_score"=> "14000",
            "score"=> "650",
        ),
    Array(
            "id" => "2",
            "player_name" => "Steve",
            "type" => "Strategy",
            "high_score"=> "10000",
            "score"=> "500",
        ),
    );
  

Ожидаемый результат:

 $arr = Array (
    '1'=>
    Array(
            "id" => "1",
            "player_name" => "Jack",
            "type" => "Arcades,Racing",
            "high_score"=> "12000",
            "score"=> "1200",
        ),
    '2'=>
    Array(
            "id" => "2",
            "player_name" => "Steve",
            "type" => "Racing,Arcades,Casual,Strategy",
            "high_score"=> "14000",
            "score"=> "2150",
        ),
  );
  

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

Ответ №1:

 foreach($arr as $val)
{
  $newarray[$val['id']]['id']=$val['id'];
   $newarray[$val['id']]['player_name']=$val['player_name'];
    $newarray[$val['id']]['type']=isset($newarray[$val['id']]['type'])?$newarray[$val['id']]['type'].','.$val['type']:$val['type'];
     $newarray[$val['id']]['high_score']=$val['high_score'];  
      $newarray[$val['id']]['score']=isset($newarray[$val['id']]['score'])?$val['score'] $newarray[$val['id']]['score']:$val['score'];  
}
 print_r($newarray);
  

Комментарии:

1. @nice… но это даст рекорд как 10000 для идентификатора 2, который равен 14000, но в целом короткий и быстрый 🙂 1 для короткого ответа

2. рекорд также может быть проверен с условием на каждой итерации

Ответ №2:

Вот ваше решение.

 $res = [];
$highScore = [];
$type = [];
$score= [];
foreach($arr as $val){
    $highScore[$val['player_name']][] = $val['high_score'];
    $type[$val['player_name']][] = $val['type'];
    $score[$val['player_name']][] = $val['score'];
    $res[$val['id']] = $val;        
    $res[$val['id']]['high_score'] = !empty($highScore[$val['player_name']])? max($highScore[$val['player_name']]) : '';
    $res[$val['id']]['type'] = !empty($type[$val['player_name']]) ? implode(',',$type[$val['player_name']]) : '';
    $res[$val['id']]['score'] = !empty($score[$val['player_name']]) ? array_sum($score[$val['player_name']]) : 0;
}
echo '<pre>'; print_r($res);
  

Комментарии:

1. Но если я добавлю еще один массив, подобный:- Array( «id» => «1», «имя_плеера» => «Отметка», «тип» => «Гонки», «рекорд»=> «12000», «оценка» => «500», ), первыйимя записи становится меткой, есть идеи разделить массив группы 1 на 2 записи, то есть группа 1 имеет 2 записи, такие как jack и mark?

Ответ №3:

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

 $output = array();
foreach($arr as $array){    
    if(array_key_exists($array['id'],$output)){
        $output[$array['id']][0]['type'] = $output[$array['id']][0]['type'].','.$array['type'];
        $output[$array['id']][0]['high_score'] = $output[$array['id']][0]['high_score'] > $array['high_score'] ? $output[$array['id']][0]['high_score'] : $array['high_score']; 
        $output[$array['id']][0]['score'] = $output[$array['id']][0]['score']   $array['score'];

    }else {
         $output[$array['id']][]  = $array;
        }

}

echo "<pre>";print_r($output);
  

Вывод

 Array
(
    [1] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [player_name] => Jack
                    [type] => Arcades,Racing
                    [high_score] => 12000
                    [score] => 1200
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [player_name] => Steve
                    [type] => Racing,Arcades,Casual,Strategy
                    [high_score] => 14000
                    [score] => 2150
                )

        )

)