За последние 24 часа нас посетили 18016 программистов и 1653 робота. Сейчас ищут 1425 программистов ...

Сортировка многомерных массивов по ключу

Тема в разделе "PHP для новичков", создана пользователем PhantomSL, 5 фев 2009.

  1. PhantomSL

    PhantomSL Активный пользователь

    С нами с:
    16 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Существует массив со следующей структурой полей:
    $test = array //Структура для для подгрузки множества условий!
    (
    array('SQL'=> 'second', 'priority' => 2)
    array('SQL'=> 'first', 'priority' => 1),
    array('SQL'=> 'third', 'priority' => 3),
    )

    Хочу его отсортировать в соответствии со значением поля содержащего приоритет (только цифры). В итоге хочу получить:
    $test = array //Структура для для подгрузки множества условий!
    (
    array('SQL'=> 'third', 'priority' => 3),
    array('SQL'=> 'second', 'priority' => 2)
    array('SQL'=> 'first', 'priority' => 1),
    )
    Нашел множество функций для сортировки (array_multisort, asort, ksort), но вот применить их правильно не смог. Может подсобите
     
  2. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    1. Я не хочу тебя расстраивать, но... слушай, если ты не умеешь сортировать массивы, почему тема не в "новичках"?

    2. вот на этой странице смотри User Contributed Notes ака комментарии. Четвертый снизу - Exemple of sorting multi-dimensional arrays by one of it's fields. Впрочем, почитай и остальныые, очень полезное чтение.
     
  3. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    PHP:
    1.  
    2. <pre>
    3. <?
    4. $test = array(
    5.     array('SQL'=> 'second', 'priority' => 2),
    6.     array('SQL'=> 'first',  'priority' => 1),
    7.     array('SQL'=> 'third', 'priority' => 3)
    8. );
    9.  
    10. function CustomSort( &$test)
    11. {
    12.     foreach($test as $data)
    13.     {
    14.         $test2[$data['priority']] = $data['SQL'];
    15.     }
    16.    
    17.     krsort( $test2);
    18.    
    19.     foreach ($test2 as $key => $value)
    20.         $test3[] = array('SQL' => $value, 'priority' => $key);
    21.        
    22.     $test = $test3;
    23.    
    24.    
    25.     return $test;
    26. }
    27.  
    28. CustomSort($test);
    29.  
    30. print_r( $test);
    31. ?>
    32. </pre>
    33.  
    Array
    (
    [0] => Array
    (
    [SQL] => third
    [priority] => 3
    )

    [1] => Array
    (
    [SQL] => second
    [priority] => 2
    )

    [2] => Array
    (
    [SQL] => first
    [priority] => 1
    )

    )


    Может быть, это можно зделать и проще...
     
  4. PhantomSL

    PhantomSL Активный пользователь

    С нами с:
    16 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    На счет новичков извиняюсь, поверьте когда ты последний трудно оценить степень сложности вопроса:)
    Из указанных вами источников получилось собрать следующую функцию:
    PHP:
    1.  
    2. function array_sort_by_field(&$arr, $fieldname, $sort_order = SORT_ASC, $sort_type = SORT_REGULAR) {
    3.  foreach($arr as $val) $sortAux[] = $val[$fieldname];
    4.  array_multisort($sortAux, $sort_order, $sort_type, $arr);
    5.  return $arr;
    6. }
    7.  
    И мое решение получается такое: $test = array_sort_by_field($test, 'priority', SORT_DESC);

    Вариант предложенный neverlose работоспособен, но в случае одинакового 'priority' получим казус.