Help us understand the problem. What is going on with this article?

phpで簡単パイプライン関数

関数型プログラミングを学習する中でパイプライン演算子に出会い、惚れてしまいました。phpで似たようなことができないかと思い、今回の実装を行いました。

まだまだ若輩者ですのでアドバイス等いただけると嬉しいです。

前提

  1. 単一引数の関数を対象とする
  2. 中置記法が使えないので |> の形は諦める
  3. array_mapみたく不格好でもいいからとりあえずpiplineぽいことがしたい

ソース(github)

<?php

function array_pipeline($data, array $functions)
{
    $recursive = function ($data, $count = 0) use ($functions, &$recursive)
    {
        if ($count === count($functions)) return $data;
        return $recursive($functions[$count]($data), $count+1);
    };
    return $recursive($data);
}

実装のポイント

  • phpは「'関数名'()」で関数を呼べるので、関数名をarrayで受け取ることにした
  • 関数内関数を無名関数にしないと再帰的に関数を定義してしまい、エラーになる
  • 無名関数を再帰的に実行するにはuseで変数を渡すときに参照渡しにする必要がある

使用例

<?php

require 'pipeline.php';

function double($data)
{
    return $data * 2;
}

function addTwo($data)
{
    return $data + 2;
}

echo array_pipeline(5, ['double', 'addTwo']);
// 12

echo "\n";

echo array_pipeline(5, ['addTwo', 'double']);
// 14

今後の展望

  • array_pipeline($data, [['add', 3], ['minus', 7]]); のようにして単一引数の関数という制約を外したい
poposuke
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away