Как отсортировать многомерный массив в зависимости от его ключей и значений массива элементов? - PullRequest
2 голосов
/ 26 июня 2010

У меня есть массив разрешений:

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

, которые мне нужно отсортировать, чтобы наиболее «конкретный» был указан первым.Погода или нет, она зависит от ее соответствия текущему загруженному контроллеру, действию и пространству имен.

Во-первых : контроллеры трех массивов охватывают одну и ту же область, но их действия - нет.Поэтому те, у кого есть конкретные действия, должны быть отсортированы выше тех, у кого нет.

Во-вторых : они используют одно и то же пространство имен, но не один и тот же метод.Поэтому те, у которых есть определенный метод, должны быть отсортированы выше тех, у кого нет.

Если у вас есть какие-либо идеи или у вас есть вопросы, требующие пояснения, пожалуйста, спросите меня.Я был бы очень признателен за возможность сортировки этого массива, поэтому мне не нужно переделывать свою архитектуру для разрешений.

// Emil

1 Ответ

0 голосов
/ 26 июня 2010

Сначала определите эти две функции:

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;
}

Тогда:

<code>$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 '
';

Следует распечатать:

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
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...