匹配子字符串并仅保留最高值

时间:2013-07-15 13:37:47

标签: php arrays

我想在一个数组中搜索每个子数组中的重复值,如果有的话,只保留与该项相关的最高值。

这是我的问题,但我喜欢添加一个例子来澄清事情!

这是我的阵列:

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。我想匹配这些项目,看看哪些项目有最高分。另一个(具有最低点)应该被踢出阵列。

因此,在这种情况下,项012来自同一组,但2具有最高分。 01应从数组中删除。

我想要的结果是这样的:

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();
}

4 个答案:

答案 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);