23.12.2019 07:10

Сортировка массива по значениям на основе другого массива в PHP

Сортировка массива по значениям на основе другого массива в PHP

В этой статье я приведу пример, как сортировать массив по значениям на основе другого массива в PHP. Иногда вам может понадобиться придерживаться правильного порядка значений в массиве. Однако в самом PHP такой функции нет, но ее легко реализовать. Используйте эту функцию для сортировки массива по значениям на основе другого массива:

function sortArrayByValuesArray(array &$array, array $orderArray, $strict = null)
{
    if (!empty($array) && !empty($orderArray)) {
        $ordered = [];
        foreach ($orderArray as $item) {
            $search = !is_null($strict) ? array_keys($array, $item, $strict) : array_keys(preg_grep('#' . $item . '#', $array));
            if (!empty($search)) {
                foreach ($search as $key) {
                    $ordered[$key] = $array[$key];
                    unset($array[$key]);
                }
            }
        }

        $array = array_merge($ordered, $array);
    }
}

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

$array = [
    'first_key' => 'First value',
    'third_key' => 'Third value',
    'second_key' => 'Second value',
    'fifth_key' => 'Fifth value',
    'fourth_key' => 'Fourth value',
];

и отсортируем его в правильном порядке по заданному массиву

$orderArray = [
    'First value',
    'Second value',
    'Third value',
    'Fourth value',
    'Fifth value',
];

Массив будет отсортирован по значениям в правильном порядке после вызова этой функции:

sortArrayByValuesArray($array, $orderArray, true);

/**
[output]
array (
    'first_key' => 'First value',
    'second_key' => 'Second value',
    'third_key' => 'Third value',
    'fourth_key' => 'Fourth value',
    'fifth_key' => 'Fifth value',
)
 */

Вы также можете использовать регулярные выражения при сортировке в этой функции. Например, давайте отсортируем тот же массив по значениям в нужном порядке:

$orderArray = [
    '^Fi',
    'Second value',
    'Third value',
    'Fourth value',
];

В полученном массиве сначала следуют значения, начинающиеся с "Fi" (согласно регулярному выражению):

sortArrayByValuesArray($array, $orderArray);

/**
[output]
array (
    'first_key' => 'First value',
    'fifth_key' => 'Fifth value',
    'second_key' => 'Second value',
    'third_key' => 'Third value',
    'fourth_key' => 'Fourth value',
)
 */

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