ここでは、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