2015-12-29 4 views
5

У меня есть многомерный массив PHP, который я использую для генерации иерархического дерева UL. Однако перед отображением дерева UL я хотел бы отсортировать каждый уровень в массиве в алфавитном порядке с помощью атрибута name. Я представляю функцию, которая рекурсивно проверяет каждый уровень, организует его в алфавитном порядке и переходит на следующий уровень для сортировки этого уровня. Но я не знаю, как это сделать. Любая помощь будет оценена!Сортировка каждого уровня вложенного многомерного массива PHP

Мой массив:

Array ( 
[0] => Array ( 
    [id] => 39348 
    [parent] => 0 
    [name] => Test 
    [children] => Array ( 
    [0] => Array ( 
     [id] => 41911 
     [parent] => 39348 
     [name] => Test2 
     [children] => Array ( 
     [0] => Array ( 
      [id] => 40929 
      [parent] => 41911 
      [name] => Test3 
      [children] => Array ( 
       [0] => Array (
        [id] => 40779 
        [parent] => 40929 
        [name] => C 
       ) 
       [1] => Array (
        [id] => 40780 
        [parent] => 40929 
        [name] => A 
       ) 
      ) 
     ) 
    ) 
    ) 

Моя попытка, которая движется порядок вокруг, но он по-прежнему не в алфавитном порядке. Обратите внимание, что в массив ($ это, 'sortByName') требуется CodeIgniter, что я работаю в:

function recursive_sort($array) { 
    usort($array, array($this,'sortByName')); 
    foreach($array as $key => $value) { 
    if(isset($value['children']) && !empty($value['children']) && is_array($value['children'])) { 
     $array[$key]['children'] = $this->recursive_sort($value['children']); 
    } 
    } 
    return $array; 
} 

function sortByName($a, $b){ 
    return $a->name - $b->name; 
} 

UPDATE: РЕШЕНИЕ

function recursive_sort($array,$child='children') { 
     usort($array,function($a,$b){ 
      return strcasecmp($a['name'], $b['name']); 
     }); 
     foreach($array as $key => $value) { 
      if(isset($value[$child]) && !empty($value[$child]) && is_array($value[$child])) { 
       $array[$key][$child] = $this->recursive_sort($value[$child],$child); 
      } 
     } 
     return $array; 
    } 
+3

и ваша попытка? –

+0

Проверьте это, если это поможет: http://stackoverflow.com/a/3805256/5645769 –

+0

@TareqMahmood Спасибо за ссылку. Тем не менее, решения, перечисленные для этой публикации, похоже, применимы только к первому уровню внутри многомерного массива. Они не затрагивают мою ситуацию, когда у меня есть вложенные массивы. – skiindude22

ответ

2

я напечатал в алгоритмической образ мышления, чтобы вы могли реализовать код самостоятельно. Кроме того, я бы не хотел отвлекать от тебя всю забаву! :-)

Если вам не подходит, то зарегистрируйтесь this.

function example(element) { 
    if (no children exist) return 
    if (only one element exist on this level) 
     // if this code is reached, this element has children 
     example(children element) 
     return 
    names = { array of all name attributes of all elements on this level } 
    sort(names) 
    [0] => names[0] 
    [1] => names[1] 
     .. and so on for however many elements there are 
    return 
+0

используйте опыт мудро ... –

+0

@BasheerAhmed, что вы даже подразумеваете под этим? Ты запутанный человек. –

+0

О, боже мой, и даже я этого не понимал .. :) –

Смежные вопросы