Как отсортировать многомерный массив по значению?

Здесь доступны различные доступные варианты, а также плюсы и минусы каждого из них здесь .

Предлагаемые варианты:

  • Подготовьте SELECT my_column FROM my_table WHERE search_column = ?, выполните его для каждого значения, а UNION - на стороне клиента. Требуется только одно подготовленное заявление. Медленный и болезненный.
  • Подготовьте SELECT my_column FROM my_table WHERE search_column IN (?,?,?) и выполните его. Требуется один подготовленный оператор в размере IN-списка. Быстро и очевидно.
  • Подготовьте SELECT my_column FROM my_table WHERE search_column = ? ; SELECT my_column FROM my_table WHERE search_column = ? ; ... и выполните его. [Или используйте UNION ALL вместо этих точек с запятой. --ed] Требуется один подготовленный оператор в размере IN-списка. Глубоко медленно, строго хуже, чем WHERE search_column IN (?,?,?), поэтому я не знаю, почему блоггер даже предложил его.
  • Используйте хранимую процедуру для построения набора результатов.
  • Подготовьте N разных запрос размера списка IN-list; скажем, с 2, 10 и 50 значениями. Чтобы выполнить поиск IN-list с 6 различными значениями, введите запрос размера-10, чтобы он выглядел как SELECT my_column FROM my_table WHERE search_column IN (1,2,3,4,5,6,6,6,6,6). Любой достойный сервер будет оптимизировать повторяющиеся значения перед запуском запроса.

Однако ни один из этих параметров не супер.

В этих местах ответили на дублирующие вопросы с одинаково разумными альтернативами, все еще ни один из них не супер:

Правильный ответ, если вы используете JDBC4 и сервер, который поддерживает x = ANY(y), должен использовать PreparedStatement.setArray, как описано здесь :

Кажется, что нет способа заставить setArray работать с IN-lists.

1010
задан stef 19 December 2018 в 17:46
поделиться

4 ответа

Попробуйте использовать usort . Если вы все еще используете PHP 5.2 или более раннюю версию, вам нужно будет определить сортировку сначала функция:

function sortByOrder($a, $b) {
    return $a['order'] - $b['order'];
}

usort($myArray, 'sortByOrder');

Начиная с PHP 5.3, вы можете использовать анонимную функцию:

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

И, наконец, в PHP 7 вы можете использовать оператор космического корабля :

usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

Чтобы распространить это на многомерную сортировку , укажите второй / третий элементы сортировки, если первый равен нулю - лучше всего объяснено ниже. Вы также можете использовать это для сортировки по подэлементам.

usort($myArray, function($a, $b) {
    $retval = $a['order'] <=> $b['order'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});

Если вам нужно сохранить ассоциации ключей, используйте uasort () - см. сравнение функций сортировки массивов в руководстве

1634
ответ дан 19 December 2019 в 20:19
поделиться
function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"order");
278
ответ дан 19 December 2019 в 20:19
поделиться

Я обычно использую usort и передаю свою собственную функцию сравнения. В данном случае это очень просто:

function compareOrder($a, $b)
{
  return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');
68
ответ дан 19 December 2019 в 20:19
поделиться

Я использую эту функцию:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}


array_sort_by_column($array, 'order');
264
ответ дан 19 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: