RepositoryTweetIntroductionUnderbar.phpはUnderscore.jsライクなコレクション処理のためのPHPのライブラリです。Underscore.jsとの大きな違いとしてIteratorを利用した遅延リストが生成できる点が上げられます。parMap()Example以下は配列の要素を2倍にして新しい配列を返す例です。8]これをIteratorを返す実装に切り替えてみます。Iteratorは実際に要素を走査するまで計算が遅延されるので、空間効率で有利な場合があります。8]メソッドチェインで処理を書くにはchain()を利用します。StartedUnderbar.phpの動作にはバージョン5.4以上のPHP処理系と、Composerが必要です。インストールが完了したらプロジェクトルートに以下のような内容のcomposer.jsonを作成して下さい。詳しいcomposer.jsonの書き方についてはこちらを参照して下さい。installを実行するとUnderbar.phpのインストールは完了です。ClassSourceUnderbar.phpの各実装での共通の手続きが定義された抽象クラスです。すべての手続きはstaticメソッドとして定義されています。このクラスを直接扱うことはありません。ClassSourceAbstractImplArrayImpl配列を返す実装を提供するクラスです。ClassSourceAbstractImplIteratorImplIteratorを返す実装を提供するクラスです。ClassSourceAbstractImplGeneratorImplGeneratorを返す実装を提供するクラスです。GeneratorはIteratorよりも高速に動作しますが、走査を繰り返すと例外が発生することに注意して下さい。TraitSourceUnderbar.phpの手続きをmixinするためのトレイトです。このトレイトのソースはスクリプトによって自動生成されています。利用する際は対象のクラスに以下の抽象メソッドを実装する必要があります。0.2.0からchain()がこのトレイトに依存するようになりました。6'TOPFunctionsArrayImpl、IteratorImpl、GeneratorImplで利用可能な関数の一覧です。$f)$xsの各要素に対して関数$fを呼び出して$xsをそのまま返します。array)の3つの引数を取ります。$f)$xsの各要素に対して関数$fを適用します。array)の3つの引数を取ります。$gが与えられた場合はキーに対しても関数を適用します。array)の3つの引数を取ります。$acc)inject()foldl()$xsの要素の左結合で畳み込んだ結果を返します。$xs)の4つの引数を取ります。$acc)foldr()$xsの要素を右結合で畳み込んだ結果を返します。$xs)の4つの引数を取ります。$f)detect()$xsの要素の中から$fが最初にtrueを返す要素を返します。見付からなかった場合はnullを返します。$f)select()$xsの要素について$fがtrueを返すものを選択します。逆の操作を行なう関数としてreject()があります。配列のキーを維持したままフィルタリングをするので、返り値の配列のインデックスは連番にならないことがあります。$properties)$xsの要素から$propertiesのキーと値のペアに一致するものを選択します。$properties)$xsの要素から$propertiesのキーと値のペアに最初に一致するものを返します。見付からなかった場合はnullを返します。$f)$xsの要素について$fがtrueを返すものを除外します。逆の操作を行う関数としてfilter()があります。配列のキーを維持したままフィルタリングをするので、返り値の配列のインデックスは連番にならないことがあります。$f])all()$xsの要素がすべてtrueとして評価される値であればtrueを返します。$f])any()$xsの要素の中にtrueとして評価される値が1つでもあればtrueを返します。$target)$xsの要素に$targetが含まれていればtrueを返します。比較は===演算子を使って厳密に行われます。$argments...])$xsの要素をオブジェクトと見なして指定した$methodを呼び出します。$property)$xsの要素の中から指定した$propertyの値を抽出します。$f)$xsの要素の中の最大の値を返します。$fに関数を指定した場合は、その関数を適用した結果を基準にします。$fに文字列を指定した場合は、該当のプロパティを基準にします。$xsが空の時は-INFを返します。$f)$xsの要素の中の最小の値を返します。$fに関数を指定した場合は、その関数を適用した結果を基準にします。$fに文字列を指定した場合は、該当のプロパティを基準にします。$xsが空の時はINFを返します。$xs)$xsの要素の合計を返します。$xs)$xsの要素の積を返します。$xs)$xsの要素を数値と見なして平均を求めます。$f])$xsを比較関数$fを使ってソートします。$fに文字列を指定した場合は該当するプロパティを基準にします。比較関数は事前にすべての要素に対して計算するので、要素の数だけしか呼び出されません。$f])$xsの要素を$fを呼び出した結果を基準にグループ化します。$fに文字列を指定した場合は該当するプロパティを基準にします。$f)$xsの要素を$fを呼び出した結果をキーとした新しい配列にします。$fに文字列を指定した場合は該当するプロパティを基準にします。$f)$xsの要素を$fを呼び出した結果を基準にカウントします。$fに文字列を指定した場合は該当するプロパティを基準にします。$xs)$xsの要素をシャッフルします。内部で組込みのshuffle()を利用しています。$n)$xsの要素をシャッフルします。内部で組込みのshuffle()を利用しています。$xs)$xsを一度計算した要素をキャッシュするMemoizeIteratorでラップします。$xs)指定した値をキーを維持したまま連想配列にします。文字列が与えられた時は文字の配列を返します。$xs)指定した値をキーを破棄して連番のインデックスの配列にします。文字列が与えられた時は文字の配列を返します。$xs)配列の場合は要素数を、Iteratorの場合は長さを、文字列の場合は文字数を返します。$n)head()take()$xsの最初の要素を返します。$nを指定した場合は先頭からn個分の要素を含む配列を返します。$default)$xsの最初の要素を返します。見付からなかった場合は$defaultを返します。1])$xsの末尾から$n個の要素を除いた新しい配列を返します。$n)$xsの最後の要素を返します。$nに2以上の値が指定された時は末尾の$n個の要素を返します。$default)$xsの最後の要素を返します。見付からなかった場合は$defaultを返します。1])tail()drop()$xsの先頭から$n個の要素を除いた新しい配列を返します。$f)$fが最初にtrueを返すまでの要素の配列を返します。$f)$fが最初にtrueを返すまでの要素を除いた配列を返します。$xs)$xsの要素の中からfalseとして評価される値を除いた新しい配列を返します。false])ネストした配列を平坦化します。$shallowがtrueの時は1つ分の深さしか平坦化しません。$values...])$xsから$valuesの値を除いた配列を返します。$xss...)引数で指定した配列$xssを結合した上で、値が一意になる配列を返します。concat()した後にuniq()を呼び出すのと等価です。$xss...)引数で指定した配列すべてに存在する値でのみ構成される配列を新しく返します。$others...)$xsから$othersの配列の要素を取り除いた新しい配列を返します。$f])unique()$xsから要素の重複を排除します。$fに関数が与えられた場合は$fを適用した結果を基準にします。$fに文字列が与えられた場合は該当するプロパティを基準にします。比較は===を使って厳密に行われます。$xss...)$xssの各要素のインデックスが対応するもの同士を配列にして返します。指定した配列の長さが違う場合は小さいものに合わせます。この挙動はUnderscore.jsとは違いますが、引数に無限リストが含まれている時に計算が終了しなくなるためです。$f)zip()した結果に$fを適用させます。$xss)動作自体はzip()と同じですが、引数に配列の配列を受けとります。$values])$xsの要素をキーとして$valuesの要素を値として連想配列を作成します。$valuesが与えらなかった場合は$xsにキーと値のペアが格納されていることを期待します。0])$xsの中から$valueのあるインデックスを探します。存在しなかった場合は-1を返します。$fromIndexを指定した場合はそのインデックスから探索を開始します。ソート済みの配列であれば$isSortedにtrueを指定することで、二分探索による効率的な探索を実行できます。0])indexOf()の末尾から探索するバージョンです。$f])二分探索を実行して$valueの挿入位置を調べます。$n])$xsの要素が$nで指定された回数だけ繰り返された配列を返します。$nが与えられなかった場合は繰り返しを無限に続けます。ArrayImplから$nを与えずに呼び出された場合はOverflowExceptionが発生します。$n)$valueが$n個分繰り返される配列を返します。$nが与えられなかった場合は$valueを無限に繰り返し続けます。ArrayImplから呼び出された時に$nが与えられなかった場合はOverflowexceptionが発生します。$f)$accに対して$fを繰り返し適用していくIteratorを返します。ArrayImplから呼び出された場合はOverflowExceptionが発生します。$xs)$xsの要素の順序を逆順にした配列を返します。$xs)$xsをPHP組み込みのsortを使って要素を昇順にソートします。比較関数$compareが与えられた場合はusortでソートされます。$xs...)引数で指定された配列$xsを1つの配列に結合します。","])$xsの要素を$separatorを区切文字として文字列に結合します。PHP組み込みのimplodeと等価な処理です。$xs)$xsからキーをすべて取得します。$xs)$xsから値をすべて取得します。$xs)$xsの各要素をキーと値のペアの配列にして返します。$xs)$xsのキーと値を入れ替えます。キーが重複した場合は前のものを上書きします。組み込みのarray_flip()と等価な操作です。$sources...])$destinationを与えられた$sourcesで拡張します。同名のキーが存在した場合は前のものを上書きします。組み込みのarray_merge()と等価な操作です。$key)$xsからキーが$keyの値を取り出します。見つからなかった時はnullを返します。null)と等価な操作です。$default)$xsからキーが$keyの値を取り出します。見つからなかった時は$defaultを返します。$keys...])$xsの要素の中から$keysで指定されたキーの値を取り出します。$keys...])$xsの要素の中から$keysで指定されたキーの以外の値を取り出します。$defaults...])$xsに存在しないキーの値を$defaultsから補完します。isset()でキーの存在を確認しているのでnullは存在しないものとして扱われます。$interceptor)$valueを引数として$interceptorを呼び出して$valueをそのまま返します。$xs)与えられた配列かIteratorやIteratorAggregateなどのTraversableなオブジェクトが空かどうかを返します。$value)与えられた値をそのまま返します。1])$startから$stepごとにインクリメントされた$endまでの数値の配列を返します。$stepに負の値を設定するとデクリメントされます。PHP組込みのrange()とは違って$end自体は含まれません。4)map()の並列実行版です。$xsの各要素に対して関数$fを並列に適用した結果を返すParallelオブジェクトを返します。ParallelクラスはIteratorインターフェイスとCountableインターフェイスを実装しています。$fは引数(element)を1つだけ取る関数です。$nは同時に起動するワーカープロセスの数です。$nが2以上の時は複数のワーカープロセスによって処理されるため、返ってくる要素の順序は不定です。parMap()は内部でpcntl_fork()を利用しているので処理系が--enable-pcntlを指定してコンパイルされている必要があります。$value)$valueをメソッドチェインで処理するためのWrapperで包んで返します。WrapperはEnumerableをmix-inしたメソッドチェイン用のクラスです。チェイン中にtoArray()かtoList()以外のarrayかIteratorを返す関数を呼び出した場合は、返り値を新たなWrapperのインスタンスで包んで返します。それ以外の値を返す関数を呼び出した時は値をそのまま返します。2013Removallazy()を廃止map()の第3引数のキーの選択関数を廃止。