【问题标题】:How do I sort a multidimensional array depending on it's items array keys and values?如何根据项目数组键和值对多维数组进行排序?
【发布时间】:2010-06-26 14:17:20
【问题描述】:

我有一系列权限:

array(
  array( "controller" => "somewhere", "action" => "",      "namespace" => "admin", "method" => "GET" ), 
  array( "controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => "" ),
  array( "controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => "GET" )
)

我需要排序,以便首先列出最“具体”的一个。天气是否具体取决于它与当前加载的控制器、动作和命名空间的相关性。

首先:三个数组的控制器覆盖相同的区域,但它们的动作没有。因此,具有特定操作的那些应该排在那些没有的之上。

其次:它们共享相同的命名空间,但不同的方法。所以有特定方法的应该排在没有的上面。

如果您有任何想法,或者有任何需要解释的问题,请问我。我非常感谢能够对这个数组进行排序,因此我不必为权限重做我的架构。

// 埃米尔

【问题讨论】:

标签: php arrays sorting multidimensional-array


【解决方案1】:

先定义这两个函数:

function specific_sort($a, $b) {
    $r = more_specific($a, $b, 'controller');
    if ($r == 0) {
        $r = more_specific($a, $b, 'action');
        if ($r == 0) {
            $r = more_specific($a, $b, 'method');
        }
    }
    return $r;
}

function more_specific($a, $b, $key) {
    if (empty($a[$key])) {
        return 1;
    }
    if (empty($b[$key])) {
        return -1;
    }
    return 0;
}

然后:

$rt = array(
  array( "controller" => "somewhere", "action" => "",      "namespace" => "admin", "method" => "GET" ),
  array( "controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => "" ),
  array( "controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => "GET" )
);
usort($rt, 'specific_sort');
print '<pre>';
print_r($rt);
print '</pre>';

应该打印出来:

Array
(
    [0] => Array
        (
            [controller] => somewhere
            [action] => index
            [namespace] => admin
            [method] => GET
        )

    [1] => Array
        (
            [controller] => somewhere
            [action] => index
            [namespace] => admin
            [method] => 
        )

    [2] => Array
        (
            [controller] => somewhere
            [action] => 
            [namespace] => admin
            [method] => GET
        )

)

【讨论】:

  • 谢谢。我得出了同样的结论,但是希望已经内置到 php 核心(或某些插件)中的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2013-05-14
  • 2013-02-06
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多