代码之家  ›  专栏  ›  技术社区  ›  Ekampp

如何根据多维数组的项、数组键和值对其排序?

  •  2
  • Ekampp  · 技术社区  · 16 年前

    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" )
    )
    

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

    首先

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

    如果你有什么想法,或者有什么问题需要解释,请问我。我真的很感激能够排序这个数组,所以我不必重做我的权限架构。

    //埃米尔

    1 回复  |  直到 16 年前
        1
  •  0
  •   Lukman    16 年前

    首先定义这两个函数:

    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
            )
    
    )