2012-10-17 2 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; 
} 

$n (예를 들어 $ns[9]) 0이며, 조건이 실패하고 루프가 종료됩니다. 다음을 수정하십시오.

if($n !== null) 
+0

Doh! 나는 그것이 몇 시간 전에 깨달았 으면 좋겠다. 감사! –