Сортировка конкретных сложных массивов - PullRequest
2 голосов
/ 08 июня 2010

Хорошо, до;

Array (
    'home' => array('order' => 1),
    'about' => array(),
    'folio' => array('order' => 2),
    'folio/web' => array('order' => 2),
    'folio/print' => array('order' => 1)
    'contact' => array('order' => 2)
)

И желаемое после;

Array (
    'home' => array('order' => 1),
    'contact' => array('order' => 2),
    'folio' => array('order' => 2),
    'folio/print' => array('order' => 1),
    'folio/web' => array('order' => 2),
    'about' => array()
)

Я знаю, ужасно (не спрашивай!)

Посмотрите, как косая черта в ключе указывает на дочерних элементов и как порядок размещения соответственно? А предметы без заказов просто сдвинуты на дно.

Но также, как несколько «одинаковых» предметов с одинаковым порядком просто сортируются по ключу?

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Блин, почти стоит получить алгоритм пузырьковой сортировки и вообще пропустить все функции сортировки.Однако: если вы выполните один цикл:

foreach($array as $idx => $ar){
    $array[$idx]['key'] = $idx;
}

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

function somesorter($a,$b){
    //check 'keys' entry in $a & $b first for slash, act accordingly if clear
    //check absence or 'order' entry in one or both
    //compare order entry
}
1 голос
/ 08 июня 2010

Вы смотрели на http://www.php.net/manual/en/function.asort.php и http://www.php.net/manual/en/function.sort.php

Также, глядя на sort, убедитесь, что вы проверили флаги.

Этот массив может вызватьмного проблем, и я бы посоветовал вам изменить его на что-то вроде

'home' => array(
    'meta' => array('order' => 1)
 ),
'folio' => array(
    'meta' => array('order' => 2),
    'children' => array(
        'print' => array(
             'meta' => array('order' => 1)
              /*Other Children*/
         ),
        'web' => array(
              'meta' => array('order' => 2)
         )
     )
 ),

и попытаться сделать что-то немного рекурсивно.

function show_menu(&$return,$array)
{
    $return .= '<ul>';
    foreach($array as $name => $inner)
    {
       $return .= '<li>' . $name
       if(isset($inner['children']))
       {
           show_menu(&$return,$inner['children']);
       }
       $return .= '</li>';
    }
    $return .= '</ul>';
}

$menu = '';
show_menu(&$menu,$menu_array);

echo $menu;

Должно создать хорошее меню иерархии, надеюсь, этопомогает.

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