[英]PHP multidimensional array sort based on multiple criteria
让我们假设我有一个如下所示的数组
$item = Array(
[0] => Array(
"name" => "item1"
"score" => 100,
"category" => "A1",
"vote" => 80,
)
[1] => Array(
"name" => "item2",
"score" => 100,
"category" => "A1",
"vote" => 70,
)
[2] => Array(
"name" => "item3",
"score" => 80,
"category" => "A2",
"vote" => 80,
)
[3] => Array(
"name" => "item4",
"score" => 80,
"category" => "A2",
"vote" => 60,
)
[4] => Array(
"name" => "item5",
"score" => 80,
"category" => "A3",
"vote" => 80,
)
)
编辑输入:
Array
(
[0] => Array
(
[name] => item1
[score] => 100
[category] => A1
[vote] => 80
)
[1] => Array
(
[name] => item2
[score] => 100
[category] => A1
[vote] => 80
)
[2] => Array
(
[name] => item5
[score] => 80
[category] => A3
[vote] => 80
)
[3] => Array
(
[name] => item3
[score] => 80
[category] => A2
[vote] => 80
)
[4] => Array
(
[name] => item4
[score] => 80
[category] => A2
[vote] => 60
)
)
排序的优先级是score
, category
和vote
。 预期结果是:
$item = Array(
[0] => Array(
"name" => "item1"
"score" => 100,
"category" => "A1",
"vote" => 80,
)
[1] => Array(
"name" => "item5",
"score" => 80,
"category" => "A3",
"vote" => 80,
)
[2] => Array(
"name" => "item3",
"score" => 80,
"category" => "A2",
"vote" => 80,
)
[3] => Array(
"name" => "item2",
"score" => 100,
"category" => "A1",
"vote" => 70,
)
[4] => Array(
"name" => "item4",
"score" => 80,
"category" => "A2",
"vote" => 60,
)
)
编辑的预期结果:
Array
(
[0] => Array
(
[name] => item1
[score] => 100
[category] => A1
[vote] => 80
)
[1] => Array
(
[name] => item5
[score] => 80
[category] => A3
[vote] => 80
)
[2] => Array
(
[name] => item3
[score] => 80
[category] => A2
[vote] => 80
)
[3] => Array
(
[name] => item2
[score] => 100
[category] => A1
[vote] => 80
)
[4] => Array
(
[name] => item4
[score] => 80
[category] => A2
[vote] => 60
)
)
我希望根据score
对顶部的不同类别进行排序,然后vote
但如果它们是具有相同类别的两个项目,则分数较低的项目将具有较低的优先级。
基于来自 的见解,我首先根据分数、类别和投票对数组进行排序
foreach($list as $k=>$v) {
$sorted['score'][$k] = $v['score'];
$sorted['category'][$k] = $v['category'];
$sorted['vote'][$k] = $v['vote'];
}
array_multisort($sorted['score'], SORT_DESC, $sorted['category'], SORT_DESC,$sorted['vote'], SORT_DESC, $list);
它会给我:
Array
(
[0] => Array
(
[name] => item1
[score] => 100
[category] => A1
[vote] => 80
)
[1] => Array
(
[name] => item2
[score] => 100
[category] => A1
[vote] => 80
)
[2] => Array
(
[name] => item5
[score] => 80
[category] => A3
[vote] => 80
)
[3] => Array
(
[name] => item3
[score] => 80
[category] => A2
[vote] => 80
)
[4] => Array
(
[name] => item4
[score] => 80
[category] => A2
[vote] => 60
)
)
我需要再次对结果进行重新排序以在顶部显示不同的类别(请参阅编辑后的预期结果)
编辑:似乎我的示例和问题令人困惑。 这个想法是我想根据分数对项目进行排序,然后投票,但应考虑类别。 除了得分和投票之外,我希望有时间将不同的类别放在首位,然后得分和投票随之而来。
使用 array_multisort()
<?php
$mylist = Array(
0 => Array(
"name" => "item1",
"score" => 100,
"category" => "A1",
"vote" => 80
),
1 => Array(
"name" => "item2",
"score" => 100,
"category" => "A1",
"vote" => 70
),
2 => Array(
"name" => "item3",
"score" => 80,
"category" => "A2",
"vote" => 80
),
3 => Array(
"name" => "item4",
"score" => 80,
"category" => "A2",
"vote" => 60
),
4 => Array(
"name" => "item5",
"score" => 80,
"category" => "A3",
"vote" => 80
)
);
$sort = array();
foreach($mylist as $k=>$v) {
$sort['score'][$k] = $v['score'];
$sort['category'][$k] = $v['category'];
$sort['vote'][$k] = $v['vote'];
}
# sort by event_type desc and then title asc
array_multisort($sort['vote'], SORT_DESC,$sort['score'], SORT_DESC, $sort['category'], SORT_DESC,$mylist);
echo '<pre>';
print_r($mylist);
echo '</pre>';
?>
注意:这不是答案,这只是建议。 假设是一条评论,但有代码而且很长。
首先,我只是将您的输入数组修改为这个模型:
使用此代码:
$compiled = array();
for ($i = 0; $i < count($input_arr); $i++)
{
$cat = $input_arr[$i]['category'];
$index = count($compiled[$cat]);
$compiled[$cat][$index]['name'] = $input_arr[$i]['name'];
$compiled[$cat][$index]['score'] = $input_arr[$i]['score'];
$compiled[$cat][$index]['vote'] = $input_arr[$i]['vote'];
$compiled[$cat][$index]['overall'] = $input_arr[$i]['score'] + $input_arr[$i]['vote'];
}
我只是按category
排列。 也是我加入overall
它的评分和投票的简单相加。 :)
所有的排序都在这里:
foreach ($compiled as $k => $v)
{
$json['sorted_by_vote'][$k] = sort_sub_value($compiled[$k], 'vote', false);
$json['sorted_by_score'][$k] = sort_sub_value($compiled[$k], 'score', false);
for ($i = 0;$i < count($compiled[$k]); $i++)
{
$json['sorted_by_overall'][] = $compiled[$k][$i];
}
}
$json['sorted_by_overall'] = sort_sub_value($json['sorted_by_overall'], 'overall', false);
$json['input'] = $input_arr;
$json['revamp'] = $compiled;
echo json_encode($json);
function sort_sub_value($array, $subkey, $is_asc = true)
{
foreach($array as $k=>$v)
{
$b[$k] = strtolower($v[$subkey]);
}
if ($is_asc)
asort($b); // asort -> asc | arsort ->desc
else
arsort($b);
foreach($b as $key=>$val)
{
$c[] = $array[$key];
}
return $c;
}
并将产生这个:
最后这里是示例输入,我只是搞砸了要测试的votes
。
希望这会因其他原因而有所帮助。 兄弟加油! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.