如下图所示,我有一个多维数组,在第三层中有一个关联数组,我试图基于gamesCount来操作它。我想要生成一个新的项目数组与最高的 gamesCount在每项运动。有没有一种有效的方法可以避免过度杀戮?
编辑:它可以是运动的n数,因此目标是为每项运动找到gameCounts的最大数目。
初始数组:
$array = [
[
["sport" => "soccer", "gamesCount" => 5, "gamesId" => 1],
["sport" => "soccer", "gamesCount" => 3, "gamesId" => 2],
["sport" => "soccer", "gamesCount" => 10, "gamesId" => 3],
["sport" => "soccer", "gamesCount" => 10, "gamesId" => 4],
],
[
["sport" => "basketball", "gamesCount" => 1, "gamesId" => 5],
["sport" => "basketball", "gamesCount" => 3, "gamesId" => 6],
["sport" => "basketball", "gamesCount" => 3, "gamesId" => 7],
["sport" => "basketball", "gamesCount" => 8, "gamesId" => 8],
]
];预期结果:
array(3) {
[0]=>
array(3) {
["sport"]=>
string(6) "soccer"
["gamesCount"]=>
int(10)
["gamesId"]=>
int(3)
}
[1]=>
array(3) {
["sport"]=>
string(6) "soccer"
["gamesCount"]=>
int(10)
["gamesId"]=>
int(4)
}
[2]=>
array(3) {
["sport"]=>
string(10) "basketball"
["gamesCount"]=>
int(5)
["gamesId"]=>
int(8)
}
}发布于 2017-05-19 05:57:38
试试这个,检查一下现场演示
$result = [];
foreach($array as $v)
{
$max = max(array_column($v, 'gamesCount'));
$result = array_merge($result, array_filter($v, function($value)use($max){return $value['gamesCount'] == $max;}));
}
var_dump($result);发布于 2017-05-19 06:24:22
输入:
$array=[
[
["sport"=>"soccer","gamesCount"=>5,"gamesId"=>1],
["sport"=>"soccer","gamesCount"=>3,"gamesId"=>2],
["sport"=>"soccer","gamesCount"=>10,"gamesId"=>3],
["sport"=>"soccer","gamesCount"=>10,"gamesId"=>4]
],
[
["sport"=>"basketball","gamesCount"=>1,"gamesId"=>5],
["sport"=>"basketball","gamesCount"=>3,"gamesId"=>6],
["sport"=>"basketball","gamesCount"=>3,"gamesId"=>7],
["sport"=>"basketball","gamesCount"=>8,"gamesId"=>8]
]
];方法1“具有两个循环的最容易阅读的版本”(演示)
foreach($array as $sport_array){
$most_in_sport=max(array_column($sport_array,'gamesCount')); // get highest gamesCount in sport's subarray
foreach($sport_array as $sport_row){
if($sport_row['gamesCount']==$most_in_sport){ // only keep a sport's subarray (row) if its gamesCount is the highest in the sport
$most_per_sport[]=$sport_row;
}
}
}
var_export($most_per_sport);方法2:“淫秽曲折的单线”php最低版本: 5.6 (对于那些不害怕一条龙启示录的人来说--参考:第一条评论@ https://stackoverflow.com/a/43950486/2943403.) (演示)
var_export(array_merge(...array_map(function($sport_array){$most_in_sport=max(array_column($sport_array,'gamesCount')); return array_filter($sport_array,function($sport_row)use($most_in_sport){return $sport_row['gamesCount']==$most_in_sport;});},$array)));输出:
array (
0 =>
array (
'sport' => 'soccer',
'gamesCount' => 10,
'gamesId' => 3,
),
1 =>
array (
'sport' => 'soccer',
'gamesCount' => 10,
'gamesId' => 4,
),
2 =>
array (
'sport' => 'basketball',
'gamesCount' => 8,
'gamesId' => 8,
),
)决定使用哪种方法取决于每个程序员。第一种方法将是最有效和最容易理解的。第二个变量将生成更少的全局变量,并且需要更少的代码行。如果你试图避免“过度杀戮”的方法#1是无法击败的。
https://stackoverflow.com/questions/44062301
复制相似问题