按键排序数组

3

有人能帮我吗?我想按键'rel'对这个多维数组items[]进行排序。

print_r ($items) will output:



 Array(

 [36] => Array
    (
        [id] => 36
        [name] => mp4
        [total_items] => 58
        [rel] => 5.3015
    )

[61] => Array
    (
        [id] => 61
        [name] => mp3
        [total_items] => 61
        [rel] => 21.7269
    )

[63] => Array
    (
        [id] => 63
        [name] => avi
        [total_items] => 43
        [rel] => 2.254
    )
 )

我需要的是:第一[61],第二[36],然后是[63]。

谢谢!

4个回答

2

以下是我所使用的:

function array_sort(&$array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

这是如何使用它的示例代码:

这样使用:

array_sort($items, 'rel');

考虑到人们在这里经常询问此功能,建议将其添加到PHP标准库中。 - Parris Varney
@PMV 他们问这个问题,是因为他们没有阅读文档 ;) 有一个函数可以不需要那么多代码来实现。使用closures,甚至更简单。 - Tadeck
@Tadek,您只能在较新版本的PHP中使用匿名函数。 - Naftali
你必须为uasort()编写额外的代码,而许多人对回调函数不太熟悉。 - Parris Varney
非常感谢大家!我认为像 PMV 一样考虑将其包含在 PHP 函数库中! - betus
显示剩余2条评论

2

有一个用于此目的的函数,它被称为uasort

请参考usort文档中的第一个和第二个示例,并进行修改,例如:

function cmp($a, $b)
{
    if ($a['rel'] == $b['rel']) {
        return 0;
    }
    return ($a['rel'] < $b['rel']) ? -1 : 1;
}

uasort($your_array, "cmp");

有帮助吗?

编辑:

如果您的PHP版本高于5.3,您可以使用闭包

uasort($your_array, function($a, $b){
    if ($a['rel'] == $b['rel']) {
        return 0;
    }
    return ($a['rel'] < $b['rel']) ? -1 : 1;
});

EDIT2:

我犯了一个错误:usort()用于排序而不维护键关联(请参见更多信息),uasort()函数是您需要的。我已经更正了上面的示例。


这是一个多维数组。$a['rel'] 是如何存在的? - Naftali
2
$a$b只是已排序的数组中的元素。由于这些元素本身也是数组,因此它们也有键(除非它们为空)-在此示例中,数组的每个元素都具有rel键。清楚吗? - Tadeck

1
$rel = array();
foreach ( $items as $key => $value )
{
    $rel[$key] = $value['rel'];
}
array_multisort($rel, SORT_ASC, $items);

那基本上只是对个别数组进行排序,是吗? - Naftali
2
"array_multisort() 可以同时对多个数组进行排序,或者按照一个或多个维度对多维数组进行排序。" 参考:http://us.php.net/array_multisort - George Cummins

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接