PHP: сортировать ассоциативный массив

0

У меня есть ассоциативный массив такого рода:

array (size=3)
  0 => 
    array (size=2)
      'percent' => float 70.12
      'txt' => string 'test' (length=4)
  1 => 
    array (size=2)
      'percent' => float 64.97
      'txt' => string 'test' (length=4)
  2 => 
    array (size=2)
      'percent' => float 89.78
      'txt' => string 'test' (length=4)

и мне нужно отсортировать его по полю percent.

Пример:

array (size=3)
  0 => 
    array (size=2)
      'percent' => float 89.78
      'txt' => string 'test' (length=4)
  1 => 
    array (size=2)
      'percent' => float 70.12
      'txt' => string 'test' (length=4)
  2 => 
    array (size=2)
      'percent' => float 64.97
      'txt' => string 'test' (length=4)

Я видел, что есть несколько функций PHP для упорядочивания массивов, но я не могу найти правильный!

  • 0
    Функция, которую вы хотите, это usort () и посмотрите на пример № 2
  • 0
    Правильный usort
Показать ещё 2 комментария
Теги:
arrays
sorting

6 ответов

2
Лучший ответ

Вы можете использовать array_multisort, чтобы вы могли сортировать и по другим полям.

foreach ($data as $key => $row) {
    $percent[$key]  = $row['percent'];
    $txt[$key] = $row['txt'];
}
array_multisort($percent, SORT_DESC, $txt, SORT_ASC, $data);
  • 0
    спасибо, это более полно, но мне достаточно отсортировать по одному полю
  • 0
    array_multisort() немного непрозрачна и требует некоторой подготовки, как показано в этом ответе, но это очень мощный зверь. Я думаю, что он работает быстрее, чем usort() для больших массивов.
2

если $ array - ваш массив

usort($array, function($a, $b) {
    return $b['percent'] - $a['percent'];
});

print_r($array); //to check it worked
  • 0
    спасибо, это сработало отлично! :)
  • 0
    Хороший трюк, вычитающий процентные значения, чтобы получить возвращаемое значение функции сравнения
Показать ещё 1 комментарий
1

попробуйте сделать это, считая, что ваше имя массива - $array

usort($array, function ($a, $b) {
    return $a['percent'] < $b['percent'];
});

print_r($array);
  • 0
    это работает, спасибо большое! :)
0
 /**
 * Sort a 2 dimensional array based on 1 or more indexes.
 * 
 * msort() can be used to sort a rowset like array on one or more
 * 'headers' (keys in the 2th array).
 * 
 * @param array        $array      The array to sort.
 * @param string|array $key        The index(es) to sort the array on.
 * @param int          $sort_flags The optional parameter to modify the sorting 
 *                                 behavior. This parameter does not work when 
 *                                 supplying an array in the $key parameter. 
 * 
 * @return array The sorted array.
 */
function msort($array, $key, $sort_flags = SORT_REGULAR) {
    if (is_array($array) && count($array) > 0) {
        if (!empty($key)) {
            $mapping = array();
            foreach ($array as $k => $v) {
                $sort_key = '';
                if (!is_array($key)) {
                    $sort_key = $v[$key];
                } else {
                    // @TODO This should be fixed, now it will be sorted as string
                    foreach ($key as $key_key) {
                        $sort_key .= $v[$key_key];
                    }
                    $sort_flags = SORT_STRING;
                }
                $mapping[$k] = $sort_key;
            }
            asort($mapping, $sort_flags);
            $sorted = array();
            foreach ($mapping as $k => $v) {
                $sorted[] = $array[$k];
            }
            return $sorted;
        }
    }
    return $array;
}

Пример ввода:

  $tickets = array(
    array(
        'id' => 13,
        'owner' => 'jachim',
        'time' => '2009-09-25 10:39:42.011612',
        'project' => 'jachim.be',
        'title' => 'Some random ticket'
    ),
    array(
        'id' => 31,
        'owner' => 'jachim',
        'time' => '2009-09-24 14:38:47.945020',
        'project' => 'joggink.be',
        'title' => 'Some other random ticket'
    ),
    array(
        'id' => 22,
        'owner' => 'root',
        'time' => '2009-09-24 10:58:02.904198',
        'project' => 'joggink.be',
        'title' => 'A specific ticket'
    )
);

Вызов функции: msort ($ tickets, array ('id')); // Это будет сортировать $ ticket по столбцу id.

Результат выборки:

Array
(
    [0] => Array
        (
            [id] => 13
            [owner] => jachim
            [time] => 2009-09-25 10:39:42.011612
            [project] => jachim.be
            [title] => Some random ticket
        )

    [1] => Array
        (
            [id] => 22
            [owner] => root
            [time] => 2009-09-24 10:58:02.904198
            [project] => joggink.be
            [title] => A specific ticket
        )

    [2] => Array
        (
            [id] => 31
            [owner] => jachim
            [time] => 2009-09-24 14:38:47.945020
            [project] => joggink.be
            [title] => Some other random ticket
        )

)

Справка:

http://blog.jachim.be/2009/09/php-msort-multidimensional-array-sort/comment-page-1/

0

Попробуйте это (предполагая, что $list - ваш массив):

usort($list,
    function(array $a, array $b) {
        if ($a['percent'] < $b['percent']) {
            return -1;
        } elseif ($a['percent'] == $b['percent']) {
            return 0;
        } else {
            return +1;
        }
    }
)

Или -1 и +1 на сортировку по убыванию.

0
$array=array(array ('percent' => 70.12,'txt' =>'test'),array ('percent' => 64.97,'txt' =>'test'),array ('percent' => 89.78,'txt' =>'test'));

array_multisort($array, SORT_DESC);
print_r($array);
//output Array ( [0] => Array ( [percent] => 89.78 [txt] => test ) [1] => Array ( [percent] => 70.12 [txt] => test ) [2] => Array ( [percent] => 64.97 [txt] => test ) ) 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню