Безразличная сортировка многомерного массива PHP с помощью array_multisort ()

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

3

Решение

Я должен отметить, что это работает только в php 5.4+

# Example results from database
$PDOresult = array(
array('name' => 'Alpha', 'price' => '10'),
array('name' => 'beta', 'price' => '12'),
array('name' => 'Gamma', 'price' => '14'),
array('name' => 'delta', 'price' => '16'),
array('name' => 'Epsilon', 'price' => '18'),
array('name' => 'zeta', 'price' => '20'),
...
);

# Create array of field to sort by - 'name' in this example
foreach ($PDOresult as $key => $row) {
$sort_by[$key] = $row['name'];
}

# Sort array - The flags SORT_NATURAL & SORT_FLAG_CASE are required to make the
# sorting case insensitive.
array_multisort($sort_by, SORT_ASC|SORT_NATURAL|SORT_FLAG_CASE, $PDOresult);

# Output
var_dump($PDOresult);

Если вы используете php 5.5+, вы можете пропустить foreach() и использовать array_column () вместо. Вот так:

$sort_by = array_column($PDOresult, 'name');

Я испытал желание отредактировать это в хорошо написанный ответ: Как я могу сортировать массивы и данные в PHP? но я не хотел испортить форматирование, так что если кто-то захочет сделать это и закрыть это, это будет хорошо для меня.

7

Другие решения

@damndaewoo

SORT_ASC|SORT_NATURAL|SORT_FLAG_CASE

В некоторых случаях даст вам:

Warning: array_multisort(): Argument #2 is an unknown sort flag

Как сказано в документации Вот Вы должны использовать «,» вместо «|»
Но вы НЕ МОЖЕТЕ сделать следующее:

SORT_ASC,SORT_NATURAL,SORT_FLAG_CASE
Потому что вы получите неожиданное:

Argument #4 is expected to be an array or sorting flag that has not already been specified

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

array_multisort($sort_by, SORT_ASC,SORT_NATURAL|SORT_FLAG_CASE, $PDOresult);

3

По вопросам рекламы [email protected]