2013-05-21 3 views
1

У меня есть PHP-массив, который выглядит следующим образом:Сортировка многомерный ассоциативный массив в PHP

array (size=1) 
    'Marriot' => 
    array (size=7) 
     0 => string 'doc5.txt' (length=8) 
     1 => string 'test.txt' (length=8) 
     2 => string 'test1.txt' (length=9) 
     3 => string 'test2.txt' (length=9) 
     4 => string 'test3.txt' (length=9) 
     5 => 
     array (size=1) 
      'Special Docs' => 
      array (size=2) 
       0 => string 'doc4.txt' (length=8) 
       1 => string 'doc3.txt' (length=8) 
     6 => 
     array (size=1) 
      'ADocs' => 
      array (size=0) 
       empty 

Как вы можете видеть, она имеет не ассоциативные файлы, а затем две папки, «Специальные Docs» и "ADocs". Моя проблема в два раза:

Во-первых, я хочу переместить две папки в верхней части массива, чтобы они были видны на моем представлении. Во-вторых, я хочу отсортировать папки в алфавитном порядке (например, поставить «ADocs» выше «Специальные документы». Я пробовал массив_мультисорт без успеха и вот-вот застрял здесь. Кто-нибудь знает, как я могу это достичь?

Спасибо за помощь .

+5

[usort] (http://php.net/manual/en/function.usort.php) может быть возможный вариант – brbcoding

ответ

0

Пример ввода

$dir = array(
    0 => 'doc5.txt', 
    1 => 'test.txt', 
    2 => 'test1.txt', 
    3 => 'test2.txt', 
    4 => 'test3.txt', 
    5 => array(
     'Special Docs' => array (
       0 => 'doc4.txt', 
       1 => 'doc3.txt' 
     ) 
    ), 
    6 => array( 
     'ADocs' => array() 
    ) 
); 

1 уровень сортировки

function cmp ($a,$b) { 
    if (is_array($a)){ 
     if (is_array ($b)) { 
      return strnatcasecmp (key($a), key($b)); 
     } else { 
      return -1; 
     } 
    } else { 
     if (is_array ($b)) { 
      return 1; 
     } else { 
      return strnatcasecmp ($a, $b); 
     } 
    } 
} 

Результат

Array 
(
    [0] => Array 
     (
      [ADocs] => Array 
       (
       ) 

     ) 

    [1] => Array 
     (
      [Special Docs] => Array 
       (
        [0] => doc4.txt 
        [1] => doc3.txt 
       ) 

     ) 

    [2] => doc5.txt 
    [3] => test.txt 
    [4] => test1.txt 
    [5] => test2.txt 
    [6] => test3.txt 
) 

Мульти сортировки уровня (неограниченное)

function cmp (&$a,&$b) { 
    if (is_array($a)){ 
     usort($a[key($a)], 'cmp'); 
     if (is_array ($b)) { 
      return strnatcasecmp (key($a), key($b)); 
     } else { 
      return -1; 
     } 
    } else { 
     if (is_array ($b)) { 
      return 1; 
     } else { 
      return strnatcasecmp ($a, $b); 
     } 
    } 
} 

usort ($dir, 'cmp'); 

Результат

Array 
(
    [0] => Array 
     (
      [ADocs] => Array 
       (
       ) 

     ) 

    [1] => Array 
     (
      [Special Docs] => Array 
       (
        [0] => doc3.txt 
        [1] => doc4.txt 
       ) 

     ) 

    [2] => doc5.txt 
    [3] => test.txt 
    [4] => test1.txt 
    [5] => test2.txt 
    [6] => test3.txt 
) 
+0

Когда я пытаюсь запустить этот скрипт, я получаю «strnatcasecmp() ожидает, что параметр 1 будет строкой, а массив« предупреждает »(по строке« return »). Кроме того, хотя он выводит массивы на верх, он не сортирует их по имени. – symlink

+0

ah исправление его сейчас –

+0

Работает как очарование, спасибо! – symlink

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