сортировка двумерного массива подобно ORDER BY

Rin

*
сортировка двумерного массива подобно ORDER BY

Столкнулся вот с такой задачей.
Есть двумерный массив, по структуре похожий на таблицу БД.
Нужно отсортировать по заданному ключу, подобно тому, как это делается в БД через ORDER BY key, type.
Может кому пригодится, оставляю решение.

PHP:
$a = Array(
   0 => Array('id' => 5,
              'name' => 'test'),
   1 => Array('id' => 3,
              'name' => 'watertaxi.jpg'),
   2 => Array('id' => 8,
              'name' => '2_0003.JPG'),
   3 => Array('id' => 4,
              'name' => '24A_0025.JPG'),
   4 => Array('id' => 11,
              'name' => '_CIMG3501.JPG'),
   5 => Array('id' => 1,
              'name' => 'a_C01.JPG'),
);

function _array_multisort_db_cmp($a, $b) {
  return strnatcasecmp($a[SORT_KEY], $b[SORT_KEY]) * (SORT_TYPE == SORT_ASC ? 1 : -1);
};

function array_multisort_db($a, $key, $order) {
  define('SORT_KEY', $key);
  define('SORT_TYPE', $order);
  usort($a, '_array_multisort_db_cmp');
  return $a;
}

print_r(array_multisort_db($a, 'id', SORT_DESC));
 

Rin

*
Покажи мне рабочее решение с использованием array_multisort
 

agx

Программер :-)
Еще подобный алгоритм можно реализовать с помощью класса :)
 

SelenIT

IT-лунатик :)
Rin, реализовать-то его можно...
PHP:
$ids = array(); $names = array();
foreach ($a as $i=>$row) {
    $ids[$i] = $row['id'];
    $names[$i] = $row['name'];
}
array_multisort($ids, SORT_NUMERIC, SORT_DESC, $names);
foreach ($a as $i=>$row) {
    $a[$i]['id'] = $ids[$i];
    $a[$i]['name'] = $names[$i];
}
print_r($a);
Хотя при именно такой структуре массива usort, наверное, все-таки рациональнее.

Но, с другой стороны, второй foreach в этом примере нужен только для восстановления формата исходного массива, а работать можно и с "промежуточными" массивами. А можно так организовать процесс получения данных (надо полагать, из файла), что и первый foreach не понадобится...
 

IntenT

SkyDiver
я столкнулся с проблемой вывода строки "строка".
Может кому пригодится, оставляю решение.
PHP:
echo "строка";
 
Сверху