ここでは、PHP でキーや値で自動的に並び替え(ソート)を行うハッシュ配列の実装サンプルを掲載しています。自動でやってくれるとありますが、結局自分で実装しています。残念。
スポンサーリンク
自動でソートするハッシュ配列サンプル
サンプルコードになります。ArrayAccess インターフェースを実装することでソート機能を実現し、for や foreach で配列のようにアクセスできるようにするために Iterator インターフェースと Countable インターフェースを実装しています。詳細はコメントを参照ください。
class sortedArray implements ArrayAccess, Iterator, Countable { /** * @var データを格納するコンテナ */ private $_data = array(); /* * キーでソートするか、値でソートするかを示す */ private $_sort; /* * true:昇順でソート false:降順でソート */ private $_asc; // コンストラクタ public function __construct($sort = 'value', $asc = true) { $this->_sort = $sort; $this->_asc = $asc; } // 配列にデータを追加・更新する public function offsetSet($offset, $value) { // データを配列に格納する if (is_null($offset)) { $this->_data[] = $value; } else { $this->_data[$offset] = $value; } // 配列をソートする if($this->_sort === 'value') { if($this->_asc === true) { asort($this->_data); // 値で昇順にソート } else { arsort($this->_data); // 値で降順にソート } } else { if($this->_asc === true) { ksort($this->_data); // キーで昇順にソート } else { krsort($this->_data); // キーで降順にソート } } } // 配列にデータが存在するかを確認 public function offsetExists($offset) { return isset($this->_data[$offset]); } // 配列からデータを削除 public function offsetUnset($offset) { unset($this->_data[$offset]); } // 配列からデータを取得 public function offsetGet($offset) { return isset($this->_data[$offset]) ? $this->_data[$offset] : null; } // Iterator インターフェースの実装 public function rewind() { reset($this->_data); } public function current() { return current($this->_data); } public function key() { return key($this->_data); } public function next() { return next($this->_data); } public function valid() { return ($this->current() !== false); } // Countable インターフェースの実装 public function count() { return count($this->_data); } }
使用例
// 値の降順にソートする $sArray = new sortedArray('value', false); $sArray['key1'] = 'data1'; // key1 を追加 $sArray['key2'] = 'data2'; // key2 を追加 $sArray['key3'] = 'data3'; // key3 を追加 foreach($sArray as $key => $value) { echo "key = $key, value = $value "; } // 出力結果 // -------------------------------- // key = key3, value = data3 // key = key2, value = data2 // key = key1, value = data1 for($i=0; $i<count($sArray); $i++) { $index = count($sArray)-$i; $key = "key$index"; echo "value = $sArray[$key] "; } // 出力結果 // -------------------------------- // value = data3 // value = data2 // value = data1