#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
)
)
)