[CakePHP4]配列を操作するならCollectionクラスを使うと便利!よく使う関数20選

[CakePHP4]配列を操作するならCollectionクラスを使うと便利!よく使う関数20選
2023年10月18日2023年10月19日

データベースからデータを取得する際、特定のデータのみを抽出したいケースが考えられます。

バッチ処理では、処理スピードの最適化のために、初めに一括でデータを取得し、その中から必要なデータのみを絞り込んで処理を行う流れが一般的です。このようなデータの抽出や操作には、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

紹介した関数以外にもまだたくさんある

今回紹介した以外にもたくさん準備されています。

append, appendItem, avg, buffered, chunk, chunkWithKeys, combine, compile, contains, countBy, each, every, extract, filter, first, firstMatch, groupBy, indexBy, insert, isEmpty, last, listNested, map, match, max, median, min, nest, prepend, prependItem, reduce, reject, sample, shuffle, skip, some, sortBy, stopWhen, sumOf, take, through, transpose, unfold, zip

意味や使い方にについては、CakePHPの公式にも説明があるので確認してみてください。

最後に

配列を操作するならCollectionを使うと便利!よく使う関数20選について紹介しました。

配列の中から0番目を取得したい場合下記のような書き方をしたりしていませんか?

$first = items[0];

Collectionクラスを使うことで簡単に0番目を取得することができます。見た目もわかりやすいですよね。

$first = items->first();

データベースから取得したデータを操作したい場合や、配列データを扱いたい場合は、ぜひCollectionクラスを使ってみてください。

コメント

コメントを残す

お名前(任意)
コメント:新規