2013-04-21 13 views
-2

Помогает ли ANYBODY сортировать многомерный массив ?! Я пытался сделать это часами, без успеха. Я пытаюсь сортировать массив «$ page» с «позицией» в порядке возрастания, так как это позиция, отображаемая на панели навигации. Любая помощь приветствуется! Уже пробовал большинство примеров в документации, но ничего не работает.Как отсортировать многомерный массив?

Array 
(
[0] => Array 
    (
     [position] => 0 
     [text] => Home 
     [url] => ./ 
     [navigation] => true 
    ) 

[1] => Array 
    (
     [position] => 0 
     [text] => 404 
     [url] => ./?p=404 
     [navigation] => false 
    ) 

[2] => Array 
    (
     [position] => 0 
     [text] => 403 
     [url] => ./?p=403 
     [navigation] => false 
    ) 

[3] => Array 
    (
     [position] => 1 
     [text] => Posts 
     [url] => ./?p=posts 
     [navigation] => true 
    ) 

[4] => Array 
    (
     [position] => 3 
     [text] => Users 
     [url] => ./?p=users 
     [navigation] => true 
    ) 

[5] => Array 
    (
     [position] => 1 
     [text] => Logout 
     [url] => ./?p=logout 
     [navigation] => false 
    ) 

[6] => Array 
    (
     [position] => 2 
     [text] => Banner 
     [url] => ./?p=banner 
     [navigation] => true 
    ) 

[7] => Array 
    (
     [position] => 5 
     [text] => Login 
     [url] => ./?p=login 
     [navigation] => false 
    ) 

) 

Пожалуйста, не говорите мне, чтобы я искал, потому что у меня есть, и ничего не работает! Один из них работал, когда я тестировал его локально, но на моем сервере возникла ошибка, поэтому мне пришлось найти альтернативу.

+0

использование рекурсии, Люк! – kirugan

+1

Какое решение было сработало, и какова была ошибка, которую сервер бросил? –

+2

ТАК, как вы пробовали его сортировать? usort()? array_multisort()? Какую ошибку вы получили? –

ответ

2

usort.

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


usort($page, "cmp"); 
+2

Не просто сказать " похоже, не работает »! Покажите, что вы на самом деле получаете, и дайте нам представление о том, чего вы ожидаете. –

+0

Не обращайте внимания, что это действительно работало (не заметил, что $ page должно быть $ page)! Большое спасибо, теперь я могу прекратить вырывать мои волосы. –

0

Вы можете попробовать этот код здесь: sandbox

Код

function intComparator($key) { 
    return function ($a, $b) use ($key) { 
     if ($a[$key] == $b[$key]) return 0; 
     return $a[$key] > $b[$key] ? 1 : -1; 
    }; 
} 

$items = Array (
    Array (
    'position' => 0, 
    'text'  => 'Home', 
    'url'  => './', 
    'navigation' => True 
), 
    Array (
    'position' => 0, 
    'text'  => '404', 
    'url'  => './?p=404', 
    'navigation' => False 
), 
    Array (
    'position' => 0, 
    'text'  => '403', 
    'url'  => './?p=403', 
    'navigation' => False 
), 
    Array (
    'position' => 1, 
    'text'  => 'Posts', 
    'url'  => './?p=posts', 
    'navigation' => True 
), 
    Array (
    'position' => 3, 
    'text'  => 'Users', 
    'url'  => './?p=users', 
    'navigation' => True 
), 
    Array (
    'position' => 1, 
    'text'  => 'Logout', 
    'url'  => './?p=logout', 
    'navigation' => False 
), 
    Array (
    'position' => 2, 
    'text'  => 'Banner', 
    'url'  => './?p=banner', 
    'navigation' => True 
), 
    Array (
    'position' => 5, 
    'text'  => 'Login', 
    'url'  => './?p=login', 
    'navigation' => False 
) 
); 

usort($items, intComparator('position')); 

for ($i = 0; $i < count($items); $i++) { 
    echo "######## Item $i ########\n"; 
    $item = $items[$i];   
    foreach($item as $key => $value) { 
    printf("%-12s=> %s\n", $key, $value); 
    } 
} 

Выход

######## Item 0 ######## 
position => 0 
text  => Home 
url   => ./ 
navigation => 1 
######## Item 1 ######## 
position => 0 
text  => 403 
url   => ./?p=403 
navigation => 
######## Item 2 ######## 
position => 0 
text  => 404 
url   => ./?p=404 
navigation => 
######## Item 3 ######## 
position => 1 
text  => Logout 
url   => ./?p=logout 
navigation => 
######## Item 4 ######## 
position => 1 
text  => Posts 
url   => ./?p=posts 
navigation => 1 
######## Item 5 ######## 
position => 2 
text  => Banner 
url   => ./?p=banner 
navigation => 1 
######## Item 6 ######## 
position => 3 
text  => Users 
url   => ./?p=users 
navigation => 1 
######## Item 7 ######## 
position => 5 
text  => Login 
url   => ./?p=login 
navigation =>