Arrays (配列操作)
Arrays クラスの概要
Peach_Util_Arrays は, 配列のソートや最大値・最小値の取得など, 配列操作に関する汎用処理を集めたユーティリティクラスです.
オブジェクトの配列をソートする
オブジェクトを含んだ配列をソートするための方法として, 一般的に usort が利用されますが, このモジュールでは Java のコレクション・フレームワークのようなオブジェクト指向的なソート API を使うことができます. オブジェクトの配列をソートする際に利用する Peach_Util_Comparator および Peach_Util_Comparable は, それぞれ java.util.Comparator, java.lang.Comparable と同じような使い方をします.
Peach_Util_Comparable の使用例
Peach_Util_Comparable を使ったソートの例を以下に示します. ソート対象のクラスで implements Peach_Util_Comparable を宣言して, compareTo() メソッド内にソート条件を定義します.
- class TestObject implements Peach_Util_Comparable
- {
- private $id;
- private $value;
- public function __construct($id, $value)
- {
- $this->id = $id;
- $this->value = $value;
- }
- public function getId()
- {
- return $this->id;
- }
- public function getValue()
- {
- return $this->value;
- }
- /**
- * 引数の TestObject の value を比較します.
- * value が等しい場合は id を比較します.
- */
- public function compareTo($subject)
- {
- if ($subject instanceof TestObject) {
- $comp = $this->value - $subject->value;
- if (0 < $comp) return 1;
- if ($comp < 0) return -1;
- $comp2 = $this->id - $subject->id;
- if (0 < $comp2) return 1;
- if ($comp2 < 0) return -1;
- return 0;
- } else {
- throw new Exception();
- }}
- }
- $arr = array(
- new TestObject(1, 250),
- new TestObject(5, 100),
- new TestObject(4, 400),
- new TestObject(3, 320),
- new TestObject(2, 400)
- );
Peach_Util_Comparator の使用例
Peach_Util_Comparable を使った例では既存のクラスに手を加えることでソートを実装しましたが, 他者が公開したクラスライブラリのように自由に改変することが難しいクラスをソートする場合や, ソート条件を状況に応じて柔軟に切り替えたい場合には Peach_Util_Comparator を使ってください. Peach_Util_Comparator を使ったソートの例を以下に示します. この例では一つの配列に対して, 4種類の Comparator を使ってソートを行います. それぞれ別の順序でソートされることに着目してください.
- class TestObject
- {
- private $id;
- private $value;
- public function __construct($id, $value)
- {
- $this->id = $id;
- $this->value = $value;
- }
- public function getId()
- {
- return $this->id;
- }
- public function getValue()
- {
- return $this->value;
- }
- }
- /**
- * 1.value 昇順, 2.ID 昇順の順番でソートします
- */
- class TestObjectComparator1 implements Peach_Util_Comparator
- {
- public function compare($var1, $var2)
- {
- if (($var1 instanceof TestObject) && ($var2 instanceof TestObject)) {
- $comp = $var1->getValue() - $var2->getValue();
- if (0 < $comp) return 1;
- if ($comp < 0) return -1;
- $comp2 = $var1->getId() - $var2->getId();
- if (0 < $comp2) return 1;
- if ($comp2 < 0) return -1;
- return 0;
- } else {
- throw new Exception();
- }}
- }
- /**
- * 1.ID 昇順, 2.value 昇順の順番でソートします
- */
- class TestObjectComparator2 implements Peach_Util_Comparator
- {
- public function compare($var1, $var2)
- {
- if (($var1 instanceof TestObject) && ($var2 instanceof TestObject)) {
- $comp = $var1->getId() - $var2->getId();
- if (0 < $comp) return 1;
- if ($comp < 0) return -1;
- $comp2 = $var1->getValue() - $var2->getValue();
- if (0 < $comp2) return 1;
- if ($comp2 < 0) return -1;
- return 0;
- } else {
- throw new Exception();
- }}
- }
- $c1 = new TestObjectComparator1();
- $c2 = new TestObjectComparator2();
- $arr = array(
- new TestObject(5, 100),
- new TestObject(3, 300),
- new TestObject(2, 100),
- new TestObject(4, 200),
- new TestObject(1, 300)
- );
- $result1 = Peach_Util_Arrays::sort($arr, $c1); // ID(value) が 2(100), 5(100), 4(200), 1(300), 3(300) の順にソート
max, min の活用方法
配列の中から最大 (あるいは最小) の項目を抜き出すというケースはよくありますが, 普通は
- 配列をソートする
- 配列の先頭 (あるいは末尾) の項目を取り出す
という手順で実現されることが多いです.
そのようなケースでは Peach_Util_Arrays::max() あるいは Peach_Util_Arrays::min() を使うことで簡単に最大・最小値を取り出すことが出来ます.
(数値の配列から最大・最小値を取り出す場合はビルトイン関数の min(), max() を使ってください. ただし, パフォーマンスは劣りますが Peach_Util_Arrays::max(), Peach_Util_Arrays::min() でも同様の結果を得られます.)
- class TestObject implements Peach_Util_Comparable
- {
- // (中略)
- }
- $arr = array(
- new TestObject(1, 250),
- new TestObject(5, 100),
- new TestObject(4, 400),
- new TestObject(3, 320),
- new TestObject(2, 400)
- );
- Prev: Map (連想配列)