Для сортировки не будем использовать никакую array_flip(), которая меняет ключи и значения местами. Тем более, что она абсолютно никак не поможет для решения данной задачи в случае многомерного массива.

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

<?php

function sort_array_by_key_value(&$array, $key, $asc = true)
{
    usort($array, function ($a, $b) use ($key, $asc) {
        $aValue = array_get($a, $key);
        $bValue = array_get($b, $key);

        return $asc ? $aValue > $bValue : $aValue < $bValue;
    });
}

function array_get($array, $key, $default = null)
{
    if (!is_array($array)) {
        return $default;
    }

    if (array_key_exists($key, $array)) {
        return $array[$key];
    }

    $key = explode('.', $key);
    $innerKey = array_shift($key);

    if (array_key_exists($innerKey, $array)) {
        $array = $array[$innerKey];
    } else {
        return $default;
    }

    return array_get($array, implode('.', $key));
}

Для удобного получения значения по ключу на любом уровне вложенности, здесь используется дополнительная функция array_get(). Подробнее об этой функции я рассказывал здесь.

Использование:

<?php

$list = [
    [
        //...другие поля
        'USER' => [
            //...другие поля
            'NAME' => 'Петр',
        ],
    ],
    [
        //...другие поля
        'USER' => [
            //...другие поля
            'NAME' => 'Иван',
        ],
    ],
];

sort_array_by_key_value($list, 'USER.NAME');

В данном примере массив $list будет отсортирован по ключу NAME, который находится внутри ключа USER, а вся структура многомерного массива сохранится.