按列值对分组多维数组进行排序

问题描述 投票:0回答:3

我需要帮助。我有这个功能:

    function getFriendsUploadActivity($user_id, $limit){
    $res = $this->exec(
        "SELECT bimg.hash,bimg.image_id,bimg.user_id,bimg.time,img_v2.server,img_v2.loc,img_v2.newname,img_v2.name FROM bimg 
        LEFT JOIN img_v2 ON bimg.image_id = img_v2.id 
        WHERE bimg.user_id IN (SELECT subscription FROM subscribes WHERE subscriber = '$user_id') 
        AND img_v2.protected = '0' 
        OR bimg.user_id = '$user_id' 
        ORDER BY bimg.time DESC"
    );
    while($r = mysql_fetch_array($res)){
        $hash[$r['hash']][] = $r;
    }

    $res2 = $this->exec(
        "SELECT * FROM sets WHERE sets.user_id IN (SELECT subscription FROM subscribes WHERE subscriber = '$user_id')  
        OR sets.user_id = '$user_id'  
        ORDER BY sets.time DESC"
    );
    while($r2 = mysql_fetch_array($res2)){
        $hash[$r2['name']][] = $r2;
    }

    return $hash;
}

这个函数返回这样的数组:

Array
(
    [5ddf] => Array
        (
            [0] => Array
                (
                    [0] => 5ddf
                    [hash] => 5ddf
                    [1] => 18778
                    [image_id] => 18778
                    [2] => 4
                    [user_id] => 4
                    [3] => 1295556514
                    [time] => 1295556514
                )

        )
    [d6e4] => Array
        (
            [0] => Array
                (
                    [0] => d6e4
                    [hash] => d6e4
                    [1] => 18631
                    [image_id] => 18631
                    [2] => 4
                    [user_id] => 4
                    [3] => 1295556512
                    [time] => 1295556512
                 )
            [1] => Array
                (
                    [0] => d6e4
                    [hash] => d6e4
                    [1] => 18630
                    [image_id] => 18630
                    [2] => 4
                    [user_id] => 4
                    [3] => 1295556510
                    [time] => 1295556510
                 )
        )

    [lorem ipsum] => Array
        (
            [0] => Array
                (
                    [0] => 33
                    [id] => 33
                    [1] => lorem ipsum
                    [name] => lorem ipsum
                    [2] => 42
                    [user_id] => 42
                    [3] => 0
                    [type] => 0
                    [4] => 233324
                    [time] => 1295745642
                )

        )
   [bla bla] => Array
        (
            [0] => Array
                (
                    [0] => 2
                    [id] => 2
                    [1] => bla bla
                    [name] => bla bla
                    [2] => 4
                    [user_id] => 4
                    [3] => 0
                    [type] => 0
                    [4] => 233324
                    [time] => 1295745632
                )

        )

)

现在 $res2 的结果被添加到数组的末尾。我需要按 [时间] 值对子数组进行排序。因此,通过这种方式,我的主数组中的所有数组都将按我可以从 [time] 值获取的时间排序。

php arrays sorting
3个回答
3
投票

您可以按照以下方式做一些事情:

function cmp($a,$b) {
   $timea = $a[0]['time'];
   $timeb = $b[0]['time'];
   if ($timea == $timeb) 
       return 0;
   return ($timea < $timeb)? -1:1;
}
uasort($hash, 'cmp');

2
投票

您可以使用

uasort
逐一遍历数组并对其进行排序。

http://www.php.net/manual/en/function.uasort.php


2
投票

可以通过

uasort
和你自己的比较功能来完成:

function maxValueOfArray($array) {
    $max = NULL;

    foreach ($array as $subarray) {
        if (array_key_exists("time", $subarray)) {
            continue;
        }

        if ($max === NULL || $max < $subarray["time"]) {
            $max = $subarray["time"];
        }   
    }

    return $max;
}

function cmpFunc($a, $b) {
    $ma = maxValueOfArray($a);
    $mb = maxValueOfArray($b);

    if ($ma == $mb) {
        return 0;
    }

    return ($ma < $mb) ? -1 : 1;
}

uasort($res, 'cmpFunc');
© www.soinside.com 2019 - 2024. All rights reserved.