我想在一个数组中搜索每个子数组中的重复值,如果有的话,只保留与该项相关的最高值。
这是我的问题,但我喜欢添加一个例子来澄清事情!
这是我的阵列:
Array
(
[0] => Array
(
[groupid] => 1
[points] => 5
)
[1] => Array
(
[groupid] => 1
[points] => 1
)
[2] => Array
(
[groupid] => 1
[points] => 4
)
[3] => Array
(
[groupid] => 2
[points] => 1
)
)
如您所见,前三项具有相同的groupid
。我想匹配这些项目,看看哪些项目有最高分。另一个(具有最低点)应该被踢出阵列。
因此,在这种情况下,项0
,1
和2
来自同一组,但2
具有最高分。 0
和1
应从数组中删除。
我想要的结果是这样的:
Array
(
[0] => Array
(
[groupid] => 1
[points] => 5
)
[1] => Array
(
[groupid] => 2
[points] => 1
)
)
我已经尝试了几个小时,但还没有运气。也许我忽略了一些非常简单的事情并且想要很难弄明白......任何帮助都将不胜感激!
修改 这是一个Drupal站点(但这应该没有任何区别),这是查询:
foreach ($promotions as $value) {
$promo = db_query("SELECT * FROM {_promo_articles} WHERE art = :art AND promoid = :promoid", array(
':art' => $value['product'][0]->sku,
':promoid' => $value['promo_id'][0])) ->fetchAll();
}
答案 0 :(得分:4)
正如我从comment看到的那样,信息来自数据库,所以做这样的事情:
(伪代码)
SELECT group_id, MAX(points)
FROM db_table
GROUP BY group_id;
答案 1 :(得分:0)
我会做类似的事情:
$final_array = array();
foreach($array AS $element)
{
if(!isset($final_array[$element["groupid"]]) ||
$final_array[$element["groupid"]] < $element["points"])
$final_array[$element["groupid"]] = $element["points"];
}
然后,$final_array
看起来像......
Array
(
[1] => 5
[2] => 1
)
(第1组有5分,第2组有1分)
答案 2 :(得分:0)
您可以使用usort函数按points
顺序排列数组。此功能将从最大到最小的顺序排序:
usort($myArray, function($a, $b) {
return $b['points'] - $a['points'];
});
答案 3 :(得分:0)
如评论中所述,如果这是一个选项,最好的方法是从您的数据库。
如果没有,你可以使用array_reduce和一个闭包(PHP 5.3 +)
$array = array_reduce($array,function(&$result, $val){
if (!array_key_exists($val["groupid"], $result){
$result[$val["groupid"]] = $val;
} else {
if ($result[$val["groupid"]]["points"] < $val["points"])
$result[$val["groupid"]]["points"] = $val["points"];
}
}, array());
然后,如果你想重置密钥
$array = array_values($array);