概要
PHPで面倒な配列処理(特にループ処理)を書かなくて済むように、.NETでお馴染みのLINQをインスパイアしたPHPライブラリをご紹介します。
コードリーディングの時、foreachなどのループで配列を操作する場合には、ブロックの先頭 → ブロックの最後 → ブロックの先頭 → …のようにループ内をグルグル回りながら処理を追っていく必要がありますが、Ginqを使用すればパイプラインのように処理の流れが一方向になるため解析が非常に楽になります。
一度使ってみればループ処理は全部Ginqに置き換えたい!Ginqが得意なフレンズになりたい!そんな気にさせてくれます。
Ginqは次のような処理を得意としています。
- データのフィルタリング
- 特定の条件を満たす要素・項目だけを抽出するなど
- データの加工/変換
- あるオブジェクトを別のオブジェクトに移送するなど
- データの集計
- 平均値、合算値、最小値、最大値の算出など
インストール
LaravelではComposerを使ってGinqをインストールします。
$ composer require "ginq/ginq":"~0.2.3" ← Ginqのインストール
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
- Installing symfony/expression-language (v2.8.25): Downloading (100%)
- Installing symfony/property-access (v2.8.25): Downloading (100%)
- Installing ginq/ginq (v0.2.4): Downloading (100%)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled services file has been removed.
$ composer show ginq/ginq ← インストールの確認
name : ginq/ginq
descrip. : LINQ to Object inspired DSL for PHP
keywords : DSL, array, iterator, linq
versions : * v0.2.4
type : library
license : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
source : [git] https://github.com/akanehara/ginq.git 723eb5144981de9efe845095606c3123b9092807
dist : [zip] https://api.github.com/repos/akanehara/ginq/zipball/723eb5144981de9efe845095606c3123b9092807 723eb5144981de9efe845095606c3123b9092807
names : ginq/ginq
autoload
psr-0
Ginq => src/
requires
php >=5.3.0
symfony/expression-language ~2.3
symfony/property-access ~2.3
requires (dev)
phpunit/phpunit ~3.7
またGitHubから直接ソースをダウンロードして利用することも可能です。
■ GitHub - akanehara/ginq: LINQ to Object
inspired DSL for PHP
https://github.com/akanehara/ginq
使用方法
Laravelの場合はGinqを使用するスクリプト内でGinqをuseします。
<?php
・・・
use Ginq;
・・・
GitHubからソースをダウンロードした場合にはsrc/Ginq/Ginq.phpをrequireします。
<?php
・・・
require_once 'src/Ginq/Ginq.php';
・・・
具体的なサンプルコードは後日公開しますが、LaravelにGinqをインストールした場合には、
次のパスにあるGinqのテストケースに目を通すことで、Ginqに備わっているメソッドとその使い方を知ることができます。
vendor/ginq/ginq/test/GinqTest.php
例えばGinqTest.phpの366行目付近にあるsumメソッドのテストケースは次のようになっています。
/**
* testSum().
*/
public function testSum() // sumメソッドのテストケース
{
$actual = Ginq::from(array(1,2,3,4,5,6,7,8,9,10))->sum(); // array(1,2,3,4,5,6,7,8,9,10) の要素の合算値を計算している
$this->assertEquals(55, $actual);
$actual = Ginq::from(array("apple", "orange", "grape"))
->sum(function($x) { return strlen($x); }); // apple、orange、grape の文字列の長さの合算値を計算している
$this->assertEquals(16, $actual);
$actual = Ginq::from(array(1,2,3,4,5,6,7,8,9,10))
->sum(function($v, $k) { return $k; }); // array(1,2,3,4,5,6,7,8,9,10) のキーの合算値を計算している
$this->assertEquals(45, $actual);
}