[CakePHP4]配列を操作するならCollectionクラスを使うと便利!よく使う関数20選
データベースからデータを取得する際、特定のデータのみを抽出したいケースが考えられます。
バッチ処理では、処理スピードの最適化のために、初めに一括でデータを取得し、その中から必要なデータのみを絞り込んで処理を行う流れが一般的です。このようなデータの抽出や操作には、Collectionクラスが非常に役立ちます。
この記事では、データ操作に便利なCollectionクラスでよく使う20選を方法を紹介します。
Collectionクラスの使い方
Collectionクラスの利用方法は直感的で簡単です。
例えば、データベースから取得したEntitiesにCollectionクラスを適用する(デフォルト)こともできます。また、予め用意した配列に対してもCollectionクラスを使用することが可能です。
■データベースから取得データした時に使用する
use Cake\ORM\TableRegistry;
$productsTable = TableRegistry::getTableLocator()->get('Products');
$products = $productsTable->find()->all();
// 税込み価格を計算する (10%の税率を考慮)
$pricesWithTax = $products->map(function ($product) {
$product->price *= 1.10;
return $product;
})->extract('price')->toList();
// サンプル結果の表示
print_r($pricesWithTax);
Array
(
[0] => 1100
[1] => 1650
[2] => 2200
...
)
■オリジナルの配列にCollectionクラスを使う
use Cake\Collection\Collection;
$products = [
['name' => 'T-Shirt', 'price' => 1000],
['name' => 'Coffee Mug', 'price' => 500],
['name' => 'Notebook', 'price' => 1500],
];
$collection = new Collection($products);
// 税込み価格を計算する (10%の税率を考慮)
$pricesWithTax = $collection->map(function ($product) {
$product['price'] *= 1.10;
return $product;
})->extract('price')->toList();
// サンプル結果の表示
print_r($pricesWithTax);
Array
(
[0] => 1100
[1] => 550
[2] => 1650
)
Collectionクラスでよく使う20選
開発時によく使うCollection関数を紹介します。
each
コレクションの各要素に関数を適用します。
例: 各要素を出力したい場合。
$collection = new Collection([1, 2, 3]);
$collection->each(function ($value) {
echo $value;
});
// 出力: 123
filter
特定の条件を満たす要素のみを取得します。
例: 偶数だけを取得したい場合。
$collection = new Collection([1, 2, 3, 4]);
$evens = $collection->filter(function ($value) {
return $value % 2 == 0;
});
// 結果: $evens = [2, 4]
map
各要素に関数を適用します。
例: 各数字を2倍にしたい場合。
$collection = new Collection([1, 2, 3]);
$results = $collection->map(function ($value) {
return $value * 2;
});
// 結果: $results = [2, 4, 6]
first
コレクションの最初の要素を取得します。
例: 最初の要素を取得したい場合。
$collection = new Collection([10, 20, 30]);
$firstItem = $collection->first();
// 結果: $firstItem = 10
last
コレクションの最後の要素を取得します。
例: 最後の要素を取得したい場合。
$collection = new Collection([10, 20, 30]);
$lastItem = $collection->last();
// 結果: $lastItem = 30
groupBy
特定のキーで要素をグループ化します。
例: 性別でデータをグループ化したい場合。
$collection = new Collection([
['name' => 'Alice', 'gender' => 'female'],
['name' => 'Bob', 'gender' => 'male'],
['name' => 'Charlie', 'gender' => 'male'],
]);
$groupedByGender = $collection->groupBy('gender');
// 結果: $groupedByGender = [
// 'female' => [['name' => 'Alice', 'gender' => 'female']],
// 'male' => [
// ['name' => 'Bob', 'gender' => 'male'],
// ['name' => 'Charlie', 'gender' => 'male']
// ]
// ]
sum
指定したキーの合計を取得します。
例: すべてのスコアの合計を計算したい場合。
$collection = new Collection([
['name' => 'Alice', 'score' => 90],
['name' => 'Bob', 'score' => 85],
['name' => 'Charlie', 'score' => 92],
]);
$totalScore = $collection->sum('score');
// 結果: $totalScore = 267
count
コレクションの要素数を取得します。
例: 要素数を知りたい場合。
$collection = new Collection([10, 20, 30]);
$count = $collection->count();
// 結果: $count = 3
sort
要素をソートします。
例: 昇順にソートしたい場合。
$collection = new Collection([30, 10, 20]);
$sorted = $collection->sort();
// 結果: $sorted = [10, 20, 30]
sortBy
特定のキーで要素をソートします。
例: スコアで降順にソートしたい場合。
$collection = new Collection([
['name' => 'Alice', 'score' => 90],
['name' => 'Bob', 'score' => 85],
['name' => 'Charlie', 'score' => 92],
]);
$sortedByScore = $collection->sortByDesc('score');
// 結果: $sortedByScore = [
// ['name' => 'Charlie', 'score' => 92],
// ['name' => 'Alice', 'score' => 90],
// ['name' => 'Bob', 'score' => 85]
// ]
isEmpty
コレクションが空かどうかを判断します。
例: コレクションが空かどうかを調べたい場合。
$collection = new Collection([]);
$isEmpty = $collection->isEmpty();
// 結果: $isEmpty = true
reject
特定の条件を満たす要素を除外します。
例: 偶数を除外したい場合。
$collection = new Collection([1, 2, 3, 4]);
$odds = $collection->reject(function ($value) {
return $value % 2 == 0;
});
// 結果: $odds = [1, 3]
slice
コレクションの一部を取得します。
例: 2番目から2つの要素を取得したい場合。
$collection = new Collection([10, 20, 30, 40]);
$sliced = $collection->slice(1, 2);
// 結果: $sliced = [20, 30]
take
コレクションの先頭から指定した数の要素を取得します。
例: 先頭から2つの要素を取得したい場合。
$collection = new Collection([10, 20, 30, 40]);
$taken = $collection->take(2);
// 結果: $taken = [10, 20]
toArray
コレクションを配列に変換します。
例: コレクションを配列に変換したい場合。
$collection = new Collection(['a', 'b', 'c']);
$array = $collection->toArray();
// 結果: $array = ['a', 'b', 'c']
zip
複数のコレクションを結合して新しいコレクションを作成します。
例: 2つの配列の要素をペアにしたい場合。
$collectionA = new Collection([1, 2, 3]);
$collectionB = new Collection(['a', 'b', 'c']);
$zipped = $collectionA->zip($collectionB);
// 結果: $zipped = [[1, 'a'], [2, 'b'], [3, 'c']]
max
特定のキーの最大値を取得します。
例: スコアの最大値を取得したい場合。
$collection = new Collection([
['name' => 'Alice', 'score' => 90],
['name' => 'Bob', 'score' => 85],
['name' => 'Charlie', 'score' => 95],
]);
$maxScore = $collection->max('score');
// 結果: $maxScore = 95
min
特定のキーの最小値を取得します。
例: スコアの最小値を取得したい場合。
$collection = new Collection([
['name' => 'Alice', 'score' => 90],
['name' => 'Bob', 'score' => 85],
['name' => 'Charlie', 'score' => 95],
]);
$minScore = $collection->min('score');
// 結果: $minScore = 85
pluck
特定のキーの値のみを取得します。
例: 全ての名前を取得したい場合。
$collection = new Collection([
['name' => 'Alice', 'score' => 90],
['name' => 'Bob', 'score' => 85],
['name' => 'Charlie', 'score' => 95],
]);
$names = $collection->pluck('name');
// 結果: $names = ['Alice', 'Bob', 'Charlie']
avg
特定のキーの平均値を取得します。
例: スコアの平均値を計算したい場合。
$collection = new Collection([
['name' => 'Alice', 'score' => 90],
['name' => 'Bob', 'score' => 85],
['name' => 'Charlie', 'score' => 95],
]);
$averageScore = $collection->avg('score');
// 結果: $averageScore = 90
紹介した関数以外にもまだたくさんある
今回紹介した以外にもたくさん準備されています。
意味や使い方にについては、CakePHPの公式にも説明があるので確認してみてください。
最後に
配列を操作するならCollectionを使うと便利!よく使う関数20選について紹介しました。
配列の中から0番目を取得したい場合下記のような書き方をしたりしていませんか?
$first = items[0];
Collectionクラスを使うことで簡単に0番目を取得することができます。見た目もわかりやすいですよね。
$first = items->first();
データベースから取得したデータを操作したい場合や、配列データを扱いたい場合は、ぜひCollectionクラスを使ってみてください。
コメント
コメントを残す