2

そのため、配列で折りたたみを実行するために、かなり複雑な「関数型」PHP コードをいくつか作成しました。安心してください、どこにも使いません。問題は、PHP の「each」関数が、静的に (実際には、下を参照) 宣言されている配列の末尾までしか移動しないように見えることです。

// declare some arrays to fold with
$six = array("_1_","_2_","_3_","_4_","_5_","_6_");

// note: $ns = range(0,100) won't work at all--lazy evaluation?
$ns = array(1,2,3,4,5,6,7,8);
$ns[8] = 9; // this item is included

// add ten more elements to $ns. each can't find these
for($i=0; $i<10; ++$i)
    $ns[] = $i;

// create a copy to see if it fixes 'each' problem
$ms = $ns;
$ms[0] = 3; // Just making sure it's actually a copy

$f   = function( $a, $b ) { return $a . $b; };
$pls = function( $a, $b ) { return $a + $b; };

function fold_tr( &$a, $f )
{
    $g = function ( $accum, &$a, $f ) use (&$g)
    {
        list($dummy,$n) = each($a);
        if($n)
        {
            return $g($f($accum,$n),$a,$f);
        }
        else
        {
            return $accum;
        }
    };
    reset($a);
    return $g( NULL, $a, $f );
}

echo "<p>".fold_tr( $six, $f  )."</p>"; // as expected: _1__2__3__4__5__6_
echo "<p>".fold_tr( $ns, $pls )."</p>"; // 45 = sum(1..9)
echo "<p>".fold_tr( $ms, $pls )."</p>"; // 47 = 3 + sum(2..9)

正直なところ、それぞれがどのようにその状態を維持しているのかわかりません。言語にはリストを反復処理するためのより優れた (非魔法の) メカニズムがあるため、せいぜい痕跡のように見えますが、$a[$index] = value'$a[] = value` を使用せずに配列に追加された項目を登録する理由を知っている人はいますか? この動作に関する洞察を事前に感謝します。

4

1 に答える 1

2

PHPの弱い型付けのおかげで、ループは早く終了します。

if($n)
{
    return $g($f($accum,$n),$a,$f);
}
else
{
    return $accum;
}

$nis 0(eg )の場合$ns[9]、条件は失敗し、ループは終了します。次のように修正します。

if($n !== null)
于 2012-10-17T23:21:13.393 に答える