Сегодня пришлось решать проблему натуральной сортировки многомерного массива, полученных из БД данных на PHP. Подробности далее.
При получении данных из БД MySQL, мною был получен многомерный массив примерно следующего вида:
array(9) {
[0]=>
array(7) {
["version"]=>string(9) "1.0.4.100"
["previous_version"]=>string(8) "1.0.4.88"
}
[1]=>
array(7) {
["version"]=>string(9) "1.0.4.106"
["previous_version"]=>string(9) "1.0.4.100"
}
[2]=>
array(7) {
["version"]=> string(9) "1.0.4.128"
["previous_version"]=> string(9) "1.0.4.106"
}
}
В данном случае мне необходимо произвести натуральную сортировку по полю «version», для этого воспользуемся функцией PHP natsort(), но т.к. данная функция работает только с одномерными массивами, придется как-то вывернуться.
Далее моё решение:
// $result_db - массив с данными из БД в формате, указанном выше.
// Формируем временный одномерный массив с необходимым для сортировки полем,
// с обязательным указанием ключа старого массива в ключе нового
foreach ($result_db as $key=>$value) {
$tmp_array[$key] = $value['version'];
}
// Полученный одномерный массив сортируем функцией natsort()
natsort($tmp_array);
// Теперь формируем новый отсортированный массив данных на основе отсортированного
// временного одномерного массива, попутно восстанавливая информацию по вложенным
// массивам с помощью указанного выше ключа.
foreach ($tmp_array as $key=>$value) {
$result[] = $result_db[$key];
}
Решение не сложное, но мне потребовалось некоторое время, чтобы его придумать. Если кому-то пригодится — буду рад.
Скриншот из интерфейса в стиле «Было/Стало»:
P.S. Да, разрабатываю кое-что для телефонов Grandstream — возможно скоро будет анонс проекта (UPD: GRCentral).