ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。エンジニアの日々の開発などの記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

【PHP】強力な配列操作ができるData Structures(ds)モジュールを動かす環境を構築してみる。

PHPの配列操作を効率的にできるモジュールでData Structuresというものが存在します。 dsモジュールは噂では、配列操作をするのにarrayよりもパフォーマンスが良いとのことで、ちょっと気になってました。ただ、日本語の記事がなかなか見つからないので、どうなんだろうと思って、まずは触ってみることにしました。

f:id:ponkotsu0605:20200711183630p:plain

はじめに

公式ドキュメントはPHPのドキュメントの中に存在します。

https://www.php.net/manual/ja/book.ds.php

ドキュメントには、「配列の 代替として提供される、PHP 7の効率的なデータ構造。」と紹介されています。(Google翻訳を適用)

詳細なベンチマークやディスカッション、よくある質問は以下のブログ記事を参考してください。結構いろんなことが書いてあるので参考になりますね。

medium.com

また、上の記事を読むと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を作ってみたいと思います。

hub.docker.com

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のクラス・メソッドを使ってみたいと思います。

お問い合わせプライバシーポリシー制作物