[ PHP ] キーや値で自動的にソートするハッシュ配列を実装する

Pocket

ここでは、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
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *