2012-10-17 46 views
2

所以,我寫了一些相當複雜的'功能'PHP代碼來執行數組摺疊。別擔心,我不會在任何地方使用它。問題是,PHP的'each'函數似乎只是靜態地(實際上,見底部)宣佈的數組的末尾。PHP每個和靜態數組聲明

// 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`來註冊添加到數組的項目?在此先感謝有關此行爲的任何見解。早感謝

回答

2

你的循環退出PHP的弱類型:

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

$n0(例如$ns[9]),病情會失敗,你的循環將終止。修復以下內容:

if($n !== null) 
+0

Doh!我希望在幾個小時前就已經意識到了這一點。謝謝! –