2012-04-11 2 views
0

Можно создать дубликат:
Sorting an associative array in PHP
Sorting a multidimensional array in PHP?Сортировка многомерного массива с PHP

меня возникают некоторые трудности с сортировкой массива ... У меня есть массив (суб) категории и элементы, но мне не удается отсортировать их ...

Массив обычно выглядит так:

array 
    'Professional Services Applications' => 
    array 
     'Specialized Technologies' => 
     array 
      'Test Michiel, part 2' => 
      array 
       0 => string '2071' (length=4) 
     'JAVA' => 
     array 
      'Senior Apple Engineer' => 
      array 
       0 => string '2067' (length=4) 
      'Junior Apple Engineer' => 
      array 
       0 => string '2069' (length=4) 
     'Microsoft' => 
     array 
      'Senior ECM Consultant' => 
      array 
       0 => string '2059' (length=4) 
      'Junior ECM Consultant' => 
      array 
       0 => string '2082' (length=4) 
    'Business Applications' => 
    array 
     '' => 
     array 
      'Business Analyst' => 
      array 
       0 => string '2053' (length=4) 
      'Test business dingen ' => 
      array 
       0 => string '2062' (length=4) 
    'acADDemICT' => 
    array 
     '' => 
     array 
      'Test Michiel 

Чтобы сделать вещи ясно,
категории являются: Профессиональные услуги Приложения, бизнес-приложений и acADDemICT.
подкатегорий являются: Специализированная, технологии, JAVA и Microsoft (некоторые из них не имеют подкатегорию!)

Я Переберите этот массив с этим PHP код:

foreach ($job_list as $category => $subcategory) { 
    $page .= '<h2>' . $category .'</h2>'; 

    foreach ($subcategory as $name => $values) { 
     if (!empty($name)) { 
     $page .= '<h3>' . $name . '</h3>'; 
     } 

     foreach ($values as $vacancy => $link) { 
     $page .= '<li>' . l("$vacancy", "node/$link[0]") . '</li>'; 
     } 
    } 
} 

Я пробовал всевозможные функции сортировки (sort(), asort(), ksort(), ...), но я не закончил с cor прямой результат.

Я стремлюсь к алфавитному порядку категорий, подкатегории и предметов ...

Так что мой идеальный результат будет выглядеть следующим образом:

**aCCademICT:** 
    - Test Michiel 
**Business Applications:** 
    - Business Analyst 
    - Test business 
**Professional Services Applications:** 
    *JAVA* 
    - Junior Apple Engineer 
    - Senior Apple Enineer 
    *Microsoft* 
    - Junior ECM Consultant 
    - Senior ECM Consultant  
    *Specialize Technologies* 
    - Test Michiel, part 2 

UPDATE:
Вот мой print_r:

Array ([Professional Services Applications] => Array ([Specialized Technologies] => Array ([Test van Michiel, part 2 ] => Array ([0] => 2071)) [JAVA] => Array ([Senior Apple Engineer ] => Array ([0] => 2067)) [Microsoft] => Array ([Junior ECM Consultant ] => Array ([0] => 2059) [Senior ECM Consultant] => Array ([0] => 2087))) [acADDemICT] => Array ([] => Array ([Test van Michiel ] => Array ([0] => 2063))) [Business Applications] => Array ([] => Array ([Business Analyst ] => Array ([0] => 2053) [Test business dingen ] => Array ([0] => 2062)))) 
+0

Опубликовать 'print_r' вашего массива, тогда кто-то может принять это и работать над решением. –

+0

Первый блок кода, который вы видите в моем вопросе, - это 'var_dump' моего массива. Разве этого недостаточно? – Michiel

+0

Я хочу только ваш массив ... не вся информация о каждом элементе этого массива, типа типа, длины и т. Д.Я могу выбрать и решить проблему. Вместо 'var_dump', я спрашиваю' print_r' –

ответ

1

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

псевдокод:

function mysort($array) { 
    foreach ($array as $key=>$value) { 
    if (is_array($value)) $array[$key] = mysort($value); 
    } 
    sort($array); 
    return $array; 
} 
+0

После некоторой проверки вы может захотеть проверить функцию array_multisort() http://se.php.net/manual/en/function.array-multisort.php – Cray

1

Как у вас есть три уровня ключей для сортировки, вы несколько должны применять ksort ко всем 2d-уровней многомерного массива:

$array = array(
    'Category Z' => array(
     'Category Z - Z' => array(
      'Category Z - Z - Z' => array('2701'), 
      'Category Z - Z - X' => array('2601'), 
     ) 
    ), 
    'Category A' => array(
     'Category A - A' => array(
      'Category A - A - A' => array('2200'), 
     ) 
    ), 
); 

$ksort = function($array) use (&$ksort) { 
    if (!is_array($array)) return $array; 
    ksort($array); 
    return array_map($ksort, $array); 
}; 

$array = $ksort($array); 

print_r($array); 

Выход :

Array 
(
    [Category A] => Array 
     (
      [Category A - A] => Array 
       (
        [Category A - A - A] => Array 
         (
          [0] => 2200 
         ) 

       ) 

     ) 

    [Category Z] => Array 
     (
      [Category Z - Z] => Array 
       (
        [Category Z - Z - X] => Array 
         (
          [0] => 2601 
         ) 

        [Category Z - Z - Z] => Array 
         (
          [0] => 2701 
         ) 

       ) 

     ) 

) 
+0

Спасибо за внимание, но, насколько я вижу, эта функция не является делая то, к чему я стремился ... Это отбрасывает некоторые значения, и я не уверен, что делает оператор 'function' в первом' array_map'. – Michiel

+0

@Michiel: Действительно, была небольшая проблема с функцией. Я также удалил инструкцию функции для 'array_map', потому что, если у вас разные уровни подкатегорий, первый пример не будет работать. – hakre