30.12.2019 07:10

Сортировка многомерного массива по полю в PHP

Сортировка многомерного массива по полю в PHP

В этой статье я приведу пример, как сортировать многомерный массив по полю (аналогично ORDER BY в базе данных) в PHP. Не всегда есть возможность должным образом отсортировать данные при извлечении их из базы данных. Некоторые данные могут быть сгенерированы на уровне PHP, например, при расчете цены продукта. После этих изменений вам может понадобиться отсортировать полученный массив данных по определенному полю (по возрастанию или по убыванию). Используйте эту функцию для сортировки многомерного массива по полю:

function orderBy(array &$array, $sortOrder)
{
    usort($array, function ($a, $b) use ($sortOrder) {
        $result = '';

        $sortOrderArray = explode(',', $sortOrder);
        foreach ($sortOrderArray AS $item) {
            $itemArray = explode(' ', trim($item));
            $field = $itemArray[0];
            $sort = !empty($itemArray[1]) ? $itemArray[1] : '';

            $mix = [$a, $b];
            if (!isset($mix[0][$field]) || !isset($mix[1][$field])) {
                continue;
            }

            if (strtolower($sort) === 'desc') {
                $mix = array_reverse($mix);
            }

            if (is_numeric($mix[0][$field]) && is_numeric($mix[1][$field])) {
                $result .= ceil($mix[0][$field] - $mix[1][$field]);
            } else {
                $result .= strcasecmp($mix[0][$field], $mix[1][$field]);
            }
        }

        return $result;
    });

    return $array;
}

Например, давайте возьмем многомерный массив с неправильной сортировкой

$array = [
    [
        'field_1' => 1,
        'field_2' => 100.58,
        'field_3' => 'C',
    ],
    [
        'field_1' => 1,
        'field_2' => 100.65,
        'field_3' => 'B',
    ],
    [
        'field_1' => 1,
        'field_2' => 100.65,
        'field_3' => 'A',
    ],
    [
        'field_1' => 3,
        'field_2' => 300.15,
        'field_3' => 'E',
    ],
    [
        'field_1' => 2,
        'field_2' => 200.26,
        'field_3' => 'D',
    ],
    [
        'field_1' => 5,
        'field_2' => 500.05,
        'field_3' => 'G',
    ],
    [
        'field_1' => 4,
        'field_2' => 400.74,
        'field_3' => 'F',
    ],
];

и отсортируем его в порядке убывания по полю "field_2":

orderBy($array, 'field_2 DESC');

/**
[output]
array (
  0 => 
  array (
    'field_1' => 5,
    'field_2' => 500.05,
    'field_3' => 'G',
  ),
  1 => 
  array (
    'field_1' => 4,
    'field_2' => 400.74,
    'field_3' => 'F',
  ),
  2 => 
  array (
    'field_1' => 3,
    'field_2' => 300.15,
    'field_3' => 'E',
  ),
  3 => 
  array (
    'field_1' => 2,
    'field_2' => 200.26,
    'field_3' => 'D',
  ),
  4 => 
  array (
    'field_1' => 1,
    'field_2' => 100.65,
    'field_3' => 'B',
  ),
  5 => 
  array (
    'field_1' => 1,
    'field_2' => 100.65,
    'field_3' => 'A',
  ),
  6 => 
  array (
    'field_1' => 1,
    'field_2' => 100.58,
    'field_3' => 'C',
  ),
)
 */

Вы также можете сортировать по нескольким полям одновременно. Например, давайте отсортируем тот же массив в порядке возрастания по полю "field_1", затем по убыванию по полю "field_2", а затем еще по возрастанию по полю "field_3":

orderBy($array, 'field_1 ASC, field_2 DESC, field_3 ASC');

/**
[output]
array (
  0 => 
  array (
    'field_1' => 1,
    'field_2' => 100.65,
    'field_3' => 'A',
  ),
  1 => 
  array (
    'field_1' => 1,
    'field_2' => 100.65,
    'field_3' => 'B',
  ),
  2 => 
  array (
    'field_1' => 1,
    'field_2' => 100.58,
    'field_3' => 'C',
  ),
  3 => 
  array (
    'field_1' => 2,
    'field_2' => 200.26,
    'field_3' => 'D',
  ),
  4 => 
  array (
    'field_1' => 3,
    'field_2' => 300.15,
    'field_3' => 'E',
  ),
  5 => 
  array (
    'field_1' => 4,
    'field_2' => 400.74,
    'field_3' => 'F',
  ),
  6 => 
  array (
    'field_1' => 5,
    'field_2' => 500.05,
    'field_3' => 'G',
  ),
)
 */

Другие статьи