PHP: сортировка многомерного массива с различной глубиной на элемент по полю - PullRequest
0 голосов
/ 27 октября 2009

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

$nav[1]=array(  
  'name'=>'home',  
  'position'=>'2',  
children=>array(

    [1]=array(
    'name'=>'page2',
     position=>'3'),

    [2]=array(
    'name'=>'page3',
    'position'=>'1'),

    [3]=array(
    'name'=>'page4',
    'position'=>'2')
)
$nav[2]=array(
  'name'=>'Second level 1',
  'position'=>'1'
);

Я надеюсь, что кто-то может мне помочь, спасибо, что подумали о проблеме.

Ответы [ 2 ]

3 голосов
/ 27 октября 2009

Сортировать каждый массив children рекурсивно. Например:

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

function sort_menu(&$item)
{
    if ($item['children']) {
        foreach ($item['children'] as &$child) {
            sort_menu($child);
        }
        usort($item['children'], "cmp");
    }
}

$tmp = array('children' => $nav);
sort_menu($tmp);
$nav = $tmp['children'];
0 голосов
/ 27 октября 2009

Вот пример использования usort.

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

usort($nav, "yourSortFunction");'

Вы можете вызвать его в массиве $ nav в рекурсии в другой функции.

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