MYSTERRIA3.0

Сортировка матрицы. Хитрая, сцуко.

Есть у нас на работе таск-трекер внутренний и в нем проект "курилка", где народ время от времени задает вопросы и делится опытом. Цитирую оттуда свое решение задачки. Задачка звучала так: "сортирнуть двухмерный массив по одному столбцу. так чтобы в случае если столбец состоит из одинаковых значений - порядок оставался прежним".

<?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;
		}
	}


Рубрики: PHP

↑ Наверх


blog comments powered by Disqus

Контакты

Igor Zinkovsky aka TLoD,Snake. Писать на электропочту, стучаться в аську 302380533, искать в Санкт-Петербурге.

© 2002-2019