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

Php 匹配子字符串并仅保留最大值,php,arrays,Php,Arrays,我想在一个数组中搜索每个子数组中的重复值,如果有,则只保留与此项连接的最高值 这是我的问题,但我喜欢添加一个例子来澄清问题 这是我的阵列: Array ( [0] => Array ( [groupid] => 1 [points] => 5 ) [1] => Array ( [groupid] => 1

我想在一个数组中搜索每个子数组中的重复值,如果有,则只保留与此项连接的最高值

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

这是我的阵列:

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();
}
正如我从您的数据库中看到的,信息来自数据库,因此请执行以下操作:

Array
(
    [0] => Array
        (
            [groupid] => 1
            [points]  => 5
        )
    [1] => Array
        (
            [groupid] => 2
            [points]  => 1
        )
)
(伪代码)

正如我从您的数据库中看到的,信息来自数据库,因此请执行以下操作:

Array
(
    [0] => Array
        (
            [groupid] => 1
            [points]  => 5
        )
    [1] => Array
        (
            [groupid] => 2
            [points]  => 1
        )
)
(伪代码)


我会这样做:

$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"];
}

(第一组得5分,第二组得1分)

我会做一些类似的事情:

$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"];
}
(第1组有5个点,第2组有1个点)

您可以使用该功能按
点对阵列进行排序。此函数将从最大到最小排序:

usort($myArray, function($a, $b) {
    return $b['points'] - $a['points'];
});
您可以使用该函数按
点对阵列进行排序。此函数将从最大到最小排序:

usort($myArray, function($a, $b) {
    return $b['points'] - $a['points'];
});

如注释中所述,最好的方法是从您的数据库中执行此操作(如果这是一个选项)

如果没有,您可以使用array_reduce和闭包(PHP5.3+)


如注释中所述,最好的方法是从您的数据库中执行此操作(如果这是一个选项)

如果没有,您可以使用array_reduce和闭包(PHP5.3+)


这些信息来自数据库吗?如果是这样的话,那么从DB.naive方法进行查询可能会容易得多,比如,使用唯一值创建一个数组(值是groupid)。然后迭代该数组,并找到该数组中每个groupid的最大值?@Neal,是的,它是。。。我也在考虑这个问题,但是你会怎么做呢?
SELECT*,max(points)as max_points FROM database GROUP BY groupid
Happy to help@Pieter:-这些信息来自数据库吗?如果是这样的话,那么从DB.naive方法进行查询可能会容易得多,比如,使用唯一值创建一个数组(值是groupid)。然后迭代该数组,并找到该数组中每个groupid的最大值?@Neal,是的,它是。。。我也在想这个问题,但是你会怎么做呢?
SELECT*,max(points)as max_points FROM database GROUP BY groupid
很乐意帮助@Pieter:-DThx获得答案,但问题是我每次都必须在
foreach
循环中查询数据库。。。所以我恐怕这不是一个解决办法…@Michiel,嗯?为什么要在
foreach
循环中查询?只需在循环之前获取所有数据!:-数据库因为每个查询都有一个不同的参数:)@Michiel再次。。。那么为什么不一次全部查询呢?我将把我的(Drupal)查询添加到这个问题中,也许这将有助于澄清我自己!答案是Thx,但问题是我每次都必须在
foreach
循环中查询数据库。。。所以我恐怕这不是一个解决办法…@Michiel,嗯?为什么要在
foreach
循环中查询?只需在循环之前获取所有数据!:-数据库因为每个查询都有一个不同的参数:)@Michiel再次。。。那么为什么不一次全部查询呢?我将把我的(Drupal)查询添加到这个问题中,也许这将有助于澄清我自己!