Здесь доступны различные доступные варианты, а также плюсы и минусы каждого из них здесь .
Предлагаемые варианты:
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 (?,?,?)
, поэтому я не знаю, почему блоггер даже предложил его. 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.
Попробуйте использовать 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 ()
- см. сравнение функций сортировки массивов в руководстве
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");
Я обычно использую usort и передаю свою собственную функцию сравнения. В данном случае это очень просто:
function compareOrder($a, $b)
{
return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');
Я использую эту функцию:
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');