Например, в чем разница между
$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. Казалось бы, первые два примера должны вести себя одинаково в той части цикла for, где используется $ foobar, но это не так для меня.
Для справки, вот мой фактический код (алгоритм еще не завершен). Я пометил цикл 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;
}
}
Если я удаляю переменную $range_adj
из цикла for и помещаю ее прямо перед циклом for как переменную none- static
, то результат моей функции будет , а не . Вот как будет выглядеть модифицированный цикл:
$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++;
}
* +1032 * ???
Мне кажется, что результаты должны быть точно такими же, но это не так. Если вы запустите мою функцию, вы заметите, что вы получаете разные результаты для каждого метода цикла for.