Есть у нас на работе таск-трекер внутренний и в нем проект "курилка", где народ время от времени задает вопросы и делится опытом. Цитирую оттуда свое решение задачки. Задачка звучала так: "сортирнуть двухмерный массив по одному столбцу. так чтобы в случае если столбец состоит из одинаковых значений - порядок оставался прежним".
<?php
$collection = array(
array('A'=>0, 'B'=>9),
array('A'=>1, 'B'=>9),
array('A'=>2, 'B'=>8),
array('A'=>3, 'B'=>7),
array('A'=>4, 'B'=>6),
array('A'=>5, 'B'=>5),
array('A'=>6, 'B'=>4),
array('A'=>7, 'B'=>3),
array('A'=>8, 'B'=>2),
array('A'=>9, 'B'=>1),
array('A'=>9, 'B'=>0),
);
echo '<pre>';
print_r($collection);
$s = new haSorter();
$s->sort($collection, 'B', haSorter::SORT_STR);
print_r($collection);
class haSorter{
const SORT_NUM = 0;
const SORT_STR = 1;
public function sort(&$arr, $col, $mode=self::SORT_STR){
$this->arr = $arr;
$this->mode = $mode;
$this->col = $col;
uksort($arr, array($this, 'scb'));
}
private function scb($ak, $bk){
$a = $this->arr[$ak];
$b = $this->arr[$bk];
/* Мы точно знаем как сортировать */
if($this->mode == self::SORT_STR){
$rv = strcmp($a[$this->col], $b[$this->col]);
if ($rv != 0) return $rv;
}else{
if($a[$this->col] > $b[$this->col]) return 1;
if($a[$this->col] < $b[$this->col]) return -1;
}
/* Монопенисуально, оставим как есть, т.е. в порядке следования ключей оригинального массива */
if($ak > $bk) return 1;
if($ak < $bk) return -1;
return 0;
}
}