詳細なPHP機能プログラミング:トランスデューサーの探索
機能的なプログラミングと高度な機能について聞いたことがあるかもしれませんが、トランスデューサーを知っていますか?この記事では、この強力なデータ変換ツールを調査します。
コアポイント:
トランスデューサーを理解するには、最初に還元剤を理解する必要があります。リッチなヒッキーを引用:
削減関数は、- これまでに結果を受信し、新しい入力を受け取り、次の結果を返す機能のタイプです。
reduce
トランスデューサーは、1つの減少関数を受信し、別の削減関数を返す関数です。トランスデューサーは、最初にリッチヒッキーによってClojureに紹介され、Michael DowlingによってPHPに移植されました。トランスデューサーは、さまざまな状況で再利用できるアルゴリズム変換を構築する強力な方法です。この記事では、一連の実用的な例を通じてその使用について説明します。
例
先に進む前に、コンポーザーを介してトランスデューサーパッケージをインストールする必要があります。
composer require mtdowling/transducers
class User { public $id; public $name; public $age; public function __construct($id, $name, $age) { $this->id = $id; $this->name = $name; $this->age = $age; } public function __toString() { return sprintf("\n%d - %s - %d", $this->id, $this->name, $this->age); } } // 示例数据 $data = [ new User(1, "younes", 24), new User(2, "youssef", 26), new User(3, "hamza", 25), new User(4, "ismail", 17), ];
use Transducers as t; $uppercase = t\map(function($user) { return new User($user->id, ucfirst($user->name), $user->age); }); $result = t\xform($data, $uppercase); var_dump($result);
関数は、PHPのmap
関数に似ています。この場合、ユーザー名の初期を大文字にする呼び出し可能な関数を渡します。 array_map
関数を使用して、xform
トランスデューサーを適用します。データを最初のパラメーターとして、トランスデューサーを2番目のパラメーターとして使用します。 uppercase
// 输出 array(4) { [0]=> object(User)#14 (3) { ["id"]=> int(1) ["name"]=> string(6) "Younes" ["age"]=> int(24) } [1]=> object(User)#15 (3) { ["id"]=> int(2) ["name"]=> string(7) "Youssef" ["age"]=> int(26) } [2]=> object(User)#16 (3) { ["id"]=> int(3) ["name"]=> string(5) "Hamza" ["age"]=> int(25) } [3]=> object(User)#17 (3) { ["id"]=> int(4) ["name"]=> string(6) "Ismail" ["age"]=> int(17) } }
データパラメーターと同じタイプの値を返します(この場合、配列)。アレイを厳密に出力する必要がある場合は、xform
を使用することもできます。 to_array
// ... $result = t\to_array($data, $uppercase); // ...
を使用して出力を文字列に変換するか、to_string
を使用して出力を特定のタイプに変換することもできます。詳細については、ドキュメントをご覧ください。 into($target, $coll, callable $xf)
composer require mtdowling/transducers
class User { public $id; public $name; public $age; public function __construct($id, $name, $age) { $this->id = $id; $this->name = $name; $this->age = $age; } public function __toString() { return sprintf("\n%d - %s - %d", $this->id, $this->name, $this->age); } } // 示例数据 $data = [ new User(1, "younes", 24), new User(2, "youssef", 26), new User(3, "hamza", 25), new User(4, "ismail", 17), ];
トランスデューサーの最良の部分は、複数の変換を1つのトランスデューサーに結合できることです。たとえば、ユーザー名の最初の文字を大文字にして、マイナーを削除しましょう。
use Transducers as t; $uppercase = t\map(function($user) { return new User($user->id, ucfirst($user->name), $user->age); }); $result = t\xform($data, $uppercase); var_dump($result);
filter
関数は、phpのarray_filter
関数に似ています。 comp
関数は、トランスデューサーリスト(この場合はuppercase
を使用して)およびmap
(removeMinors
を使用)からトランスデューサーを作成します。 filter
// 输出 array(4) { [0]=> object(User)#14 (3) { ["id"]=> int(1) ["name"]=> string(6) "Younes" ["age"]=> int(24) } [1]=> object(User)#15 (3) { ["id"]=> int(2) ["name"]=> string(7) "Youssef" ["age"]=> int(26) } [2]=> object(User)#16 (3) { ["id"]=> int(3) ["name"]=> string(5) "Hamza" ["age"]=> int(25) } [3]=> object(User)#17 (3) { ["id"]=> int(4) ["name"]=> string(6) "Ismail" ["age"]=> int(17) } }
transducer
を作成します
削減関数はパラメーターとして値を受信し、3つの要素を含む必要がある一連の削減関数を返します。
init
result
result
step
take
// ... $result = t\to_array($data, $uppercase); // ...
use Transducers as t; $uppercase = t\map(function($user) { return new User($user->id, ucfirst($user->name), $user->age); }); $result = t\to_string($data, $uppercase); var_dump($result);
take
// 输出 string(64) " 1 - Younes - 24 2 - Youssef - 26 3 - Hamza - 25 4 - Ismail - 17"
および コールバックを呼び出すか、単に値を返すかどうかを決定できます。
php FAQ
PHPでトランスデューサーを学習するために利用可能な多くのリソースがあります。 SitePointの記事など、オンラインの記事やチュートリアルを読むことから始めることができます。また、トピックをより深くカバーする本やオンラインコースもあります。最後に、独自のトランスデューサーを書いて、PHPプロジェクトでそれらを使用してみてください。 はい、トランスデューサーの概念はClojureプログラミング言語に由来し、その後JavaScriptやPHPなど、他のいくつかの言語で採用されています。各言語は独自の方法でトランスデューサーを実装しますが、基本概念は同じです。 はい、PHPの内蔵配列関数を備えたトランスデューサーを使用できます。ただし、これらの機能は、特に大きな配列を扱う場合、トランスデューサーを使用するほど効率的ではない場合があることを忘れないでください。これは、通常、PHPの配列関数が新しい配列を作成し、トランスデューサーがデータを配置できるためです。 以上がPHPのトランスデューサーは簡単になりましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。take
パラメーターを使用して複数回呼び出されます。呼び出されるたびに、result
変数を減少させ、ゼロ未満であるかどうかをテストします。この場合、ストップポイントを表すAinput
オブジェクトインスタンスを返します。 remaining
Reduced
トランスデューサー関数の例は、データから空の要素を削除します。 Transducerの仕組みの以前の説明を使用して、$input
step
$uppercase = t\map(function($user) {
return new User($user->id, ucfirst($user->name), $user->age);
});
$removeMinors = t\filter(function($user) {
return $user->age >= 18;
});
$comp = t\comp(
$uppercase,
$removeMinors
);
$result = t\to_string($data, $comp);
var_dump($result);
$data
// 输出
string(48) "
1 - Younes - 24
2 - Youssef - 26
3 - Hamza - 25"
// ....
$comp = t\comp(
$uppercase,
$removeMinors,
t\take(2)
);
$result = t\to_string($data, $comp);
var_dump($result);
PHPのトランスデューサーの基本概念は何ですか?
PHPのトランスデューサーは、構成可能で再利用可能なソフトウェアコンポーネントを作成できるデータ処理テクノロジーです。それらは本質的に、還元剤を受け入れ、新しい還元剤を返す関数です。この概念は、ClojureとJavaScriptから借用されており、PHPに適応しています。トランスデューサーを使用すると、データ変換プロセスを実際のデータソースから分離し、コードをよりモジュール化し、維持しやすくします。
従来のPHP関数は、通常、データを取得および変換するプロセスを組み合わせて、維持と再利用が困難になる可能性があります。一方、トランスデューサーは2つのプロセスを分離します。つまり、特定の方法でデータを変換するトランスデューサーを作成し、任意のデータソースで使用して、コードをより柔軟で再利用可能にすることができます。
もちろん、簡単な例を考えてみましょう。数字の配列があり、各番号に1を追加するとします。これを行うトランスデューサーを作成できます:composer require mtdowling/transducers
トランスデューサーは、任意のデータソースとともに使用するように設計されています。これは、データソースレベル全体ではなく、単一のデータアイテムレベルで実行されるためです。したがって、アレイ、データベースクエリの結果、ネットワーク接続からのデータストリームなどのトランスデューサーを使用できます。唯一の要件は、データソースが減少関数で動作できる必要があることです。
トランスデューサーは多くの利点を提供します。データ変換プロセスを実際のデータソースから分離することができ、コードがよりモジュール式でメンテナンスを容易にすることができます。また、任意のデータソースで使用できる再利用可能なソフトウェアコンポーネントを作成することもできます。最後に、トランスデューサーは単一のデータ項目で動作するため、大規模なデータセットを扱うときに、従来のPHP関数よりも効率的になる場合があります。
トランスデューサーは多くの利点を提供しますが、従来のPHP関数よりも複雑な場合もあります。これは、一部のPHP開発者に馴染みのない機能的プログラミングの概念を伴うためです。しかし、トランスデューサーがどのように機能するかを理解すると、それらはクリーンで効率的で再利用可能なコードを書くための強力なツールになります。
はい、トランスデューサーは任意のPHPフレームワークで使用できます。これらは、特定のフレームワーク機能に依存しない一般的なデータ処理テクノロジーです。ただし、一部のフレームワークでは、トランスデューサーを処理するための独自のユーティリティを提供する場合があります。これにより、使いやすくなります。
PHPのトランスデューサーの詳細についてはどうすればよいですか?
トランスデューサーは他のプログラミング言語で使用されていますか?
PHP内蔵配列関数を備えたトランスデューサーを使用できますか?