PHPの配列操作を効率的にできるモジュールでData Structuresというものが存在します。 dsモジュールは噂では、配列操作をするのにarrayよりもパフォーマンスが良いとのことで、ちょっと気になってました。ただ、日本語の記事がなかなか見つからないので、どうなんだろうと思って、まずは触ってみることにしました。
はじめに
公式ドキュメントはPHPのドキュメントの中に存在します。
https://www.php.net/manual/ja/book.ds.php
ドキュメントには、「配列の 代替として提供される、PHP 7の効率的なデータ構造。」と紹介されています。(Google翻訳を適用)
詳細なベンチマークやディスカッション、よくある質問は以下のブログ記事を参考してください。結構いろんなことが書いてあるので参考になりますね。
また、上の記事を読むとPHPのarrayやSplDoublyLinkedListを使うよりも(条件によっては)使用メモリー量が少なかったり、処理時間が短かったり、と良い結果が出ているっぽいですね。ハッシュをうまく使っているみたい。
ということで、arrayを使わず、またLaravelなどCollectionを使わずに、このData Structuresを使うと良いのかも?と思い、まずは動く環境を用意したいと思います。
環境構築
ドキュメントはこちらですね。
https://www.php.net/manual/ja/ds.setup.php
要件としては、PHP7っぽいですね。
導入は以下のコマンドで終わり。
pecl install ds
ということで、dockerでPHPの環境を作ってみたいと思います。 Docker HubのPHPのページを参考にしながらDockerfileを作ってみたいと思います。
FROM php:7.4.6-fpm RUN pecl install redis-5.1.1 \ && pecl install xdebug-2.8.1 \ && pecl install ds \ && docker-php-ext-enable redis xdebug ds RUN cd /usr/bin \ && curl -s http://getcomposer.org/installer | php \ && ln -s /usr/bin/composer.phar /usr/bin/composer WORKDIR /var/www
ということで、上記のようなDockerfileを作ってみました。 redisとかxdebugは不要だと思うので、削除してしまっても良いかと思います。
このような環境でコンテナをビルドして実行していきます。
サンプルプログラムを動かしてみよう
ということで、実際に一つ動かしてみましょう!
https://www.php.net/manual/ja/ds-map.map.php
Mapという構造についての、filterというメソッドを使って動作確認してみたいと思います。
<?php $map = new \Ds\Map(["a", "b", "c", "d", "e"]); var_dump($map->filter(function($key, $value) { return $key % 2 == 0; }));
これを実行すると・・・
# php ds/test/map.php /var/www/ds/test/map.php:6: class Ds\Map#3 (3) { public ${0} => class Ds\Pair#2 (2) { public $key => int(0) public $value => string(1) "a" } public ${1} => class Ds\Pair#4 (2) { public $key => int(2) public $value => string(1) "c" } public ${2} => class Ds\Pair#5 (2) { public $key => int(4) public $value => string(1) "e" } }
わかりにくいかもですが、filterを使って偶数の文字(a,c,e)だけをフィルタリングすることができました。
さいごに
動作確認環境はできたので、これからいろんなdsのクラス・メソッドを使ってみたいと思います。