# SortHelper.class.php

Go to the documentation of this file.

    00001 <?php
    00002 /***************************************************************************
    00003  *   Copyright (C) 2009 by Denis M. Gabaidulin                             *
    00004  *                                                                         *
    00005  *   This program is free software; you can redistribute it and/or modify  *
    00006  *   it under the terms of the GNU Lesser General Public License as        *
    00007  *   published by the Free Software Foundation; either version 3 of the    *
    00008  *   License, or (at your option) any later version.                       *
    00009  *                                                                         *
    00010  ***************************************************************************/
    00011
    00015     final class SortHelper extends Singleton implements Instantiatable
    00016     {
    00017         const ASC   = 0x1;
    00018         const DESC  = 0x2;
    00019
    00020         private $vector = null;
    00021         private $keys   = null; // pairs of key name and direction
    00022
    00023         private $defaultCmpFunction = 'strnatcmp';
    00024
    00025         public static function me()
    00026         {
    00027             return Singleton::getInstance('SortHelper');
    00028         }
    00029
    00030         public function setVector(&$vector)
    00031         {
    00032             $this->vector = &$vector;
    00033
    00034             return $this;
    00035         }
    00036
    00037         public function setKeys($keys)
    00038         {
    00039             $this->keys = $keys;
    00040
    00041             foreach ($this->keys as &$keyData)
    00042                 if (!isset($keyData[2]))
    00043                     $keyData[2] = $this->defaultCmpFunction;
    00044
    00045             return $this;
    00046         }
    00047
    00048         public function sort()
    00049         {
    00050             Assert::isGreater(count($this->keys), 0);
    00051             Assert::isNotEmptyArray($this->vector);
    00052
    00053             usort($this->vector, array($this, "compare"));
    00054         }
    00055
    00056         private function compare($one, $two, $keyIndex = 0)
    00057         {
    00058             Assert::isTrue(
    00059                 isset($one[$this->keys[$keyIndex][0]])
    00060                 || array_key_exists($this->keys[$keyIndex][0], $one),
    00061                 'Key must be exist in vector!'
    00062             );
    00063
    00064             $result =
    00065                 $this->keys[$keyIndex][2](
    00066                     $one[$this->keys[$keyIndex][0]],
    00067                     $two[$this->keys[$keyIndex][0]]
    00068                 );
    00069
    00070             if ($this->keys[$keyIndex][1] == self::DESC)
    00071                 $result *= -1;
    00072
    00073             if ($result == 0) {
    00074                 $keyIndex++;
    00075
    00076                 if (isset($this->keys[$keyIndex]))
    00077                     $result = $this->compare($one, $two, $keyIndex);
    00078              }
    00079
    00080              return $result;
    00081         }
    00082     }
    00083 ?>