【发布时间】:2011-07-05 04:47:09
【问题描述】:
比如有什么区别
$foobar = 0
for ($i=0; $i<20; $i++) {
//do something using $foobar
$foobar++;
}
和
for ($i=0; $i<20; $i++) {
static $foobar = 0
//do something using $foobar
$foobar++;
}
???
以上两个示例的结果与以下示例不同:
for ($i=0; $i<20; $i++) {
$foobar = 0
//do something using $foobar
$foobar++;
}
所有三种变体都有不同的结果。我知道在三个示例的 first 中,$foobar 变量的值越来越大,而在 第三个 示例中,$foobar 变量的值被重置在每个循环期间。我不确定使用静态 $foobar 变量的示例发生了什么。前两个示例在使用 $foobar 的 for 循环部分中的行为似乎应该相同,但对我而言并非如此。
作为参考,这是我的实际代码(算法尚未完成)。我已经标记了让我思考这个话题的 for() 循环:
function combine($charArr, $k) {
$currentsize = sizeof($charArr);
static $combs = array();
static $originalsize = "unset";
if ($originalsize === "unset") $originalsize = $currentsize;
static $firstcall = true;
if ($originalsize >= $k) {
$comb = '';
if ($firstcall === true) {
for ($i = $originalsize-$k; $i < $originalsize; $i++) {
$comb .= $charArr[$i];
}
$combs[] = $comb;
$firstcall = false;
}
if ($currentsize > $k) {
$comb = ''; //reset
for ($i=0; $i<$k; $i++) {
$comb .= $charArr[$i];
}
$combs[] = $comb;
//########### THE FOR LOOP IN QUESTION ###########
for ($i = $k-1; $i >= 0; $i--) {
static $range_adj = 0;
for ( $j = $i+1; $j < $currentsize-$range_adj; $j++ ) {
if ( !($i == 0 and $j == $currentsize-$range_adj-1) ) {
$comb = substr_replace($comb, $charArr[$j], $i, 1);
$combs[] = $comb;
}
}
$range_adj++;
}
if ($currentsize-1 > $k) {
array_splice($charArr, 0, 1);
combine($charArr, $k);
}
}
$output = array_values( $combs );
unset($combs);
return $output;
}
else {
return false;
}
}
如果我从 for 循环中删除 $range_adj 变量并将其作为 none-static 变量放在所述 for 循环之前,那么我的函数的结果是 不 相同的。修改后的 for 循环如下所示:
$range_adj = 0;
for ($i = $k-1; $i >= 0; $i--) {
for ( $j = $i+1; $j < $currentsize-$range_adj; $j++ ) {
if ( !($i == 0 and $j == $currentsize-$range_adj-1) ) {
$comb = substr_replace($comb, $charArr[$j], $i, 1);
$combs[] = $comb;
}
}
$range_adj++;
}
我得到两种不同结果的事实使我相信每种方法都有所不同,因为如果两种方法产生相同的结果,那么我的函数的结果在两种情况下都是相同的,这不是我测试这些场景时的情况。为什么我得到两个结果?用实现的 for 循环的两种方法测试我的函数,你也会得到不同的结果。
为方便起见,这里是原始方法:
for ($i = $k-1; $i >= 0; $i--) {
static $range_adj = 0;
for ( $j = $i+1; $j < $currentsize-$range_adj; $j++ ) {
if ( !($i == 0 and $j == $currentsize-$range_adj-1) ) {
$comb = substr_replace($comb, $charArr[$j], $i, 1);
$combs[] = $comb;
}
}
$range_adj++;
}
???
在我看来,结果应该完全相同,但事实并非如此。如果你运行我的函数,你会注意到 for 循环的每个方法都会得到不同的结果。
【问题讨论】:
-
第二个得到什么结果?
-
解析错误是可以从所有这些代码中得到的唯一结果;)
-
上校。弹片,我没有收到解析错误!我在上面发布了我的功能。
-
说真的。有人可以回答这个问题吗?我已经尽可能详细地更新了!