PHP: почему значение изменяется, если нет присваивания? - PullRequest
1 голос
/ 29 июня 2019

По сути, это не так уж и много, так как я вставил echo в свой код.Это CLI-скрипт, который должен быть однопоточным.

echo "\$map: ".json_encode($map)."\n\$mapHarvests: ".json_encode($mapHarvests)."\n";

foreach($map as $key => $section)
    if($players[$id]->pos < $section[0])
        break;

    elseif($players[$id]->pos < $section[1] && isset($mapHarvests[$key]))
    {
        $harvesters[$id] = [$currentTime, $key];
        break;
    }

echo "\$map: ".json_encode($map)."\n\$mapHarvests: ".json_encode($mapHarvests)."\n";

Вот что выводит консоль:

$map: [[-560,-240],[240,560]]
$mapHarvests: [[[0],1],[[1,2,3],1]]
$map: [[-560,-240],[240,560]]
$mapHarvests: [[[0],1],[240,560]]

Почему модифицируется $mapHarvests?Я попытался переключить isset() с array_key_exists(), и то же самое получилось.Есть более причудливый взгляд на код:

foreach($map as $key => $section)
    if(sectionStartsAfterPlayerPos())
        break;

    elseif(playerIsInSection() && sectionCanBeHarvested())
    {
        registerPlayer();
        break;
    }

Правка 1: вот как объявляются переменные:

$map = [0 => [-560, -240], 1 => [240, 560]];
$mapHarvests = [0 => [[0], 1], 1 => [[1, 2, 3], 1]];
$harvesters = [];
$currentTime = time(); // this one is inside the main loop

1 Ответ

2 голосов
/ 29 июня 2019

Я нашел проблему. В основном цикле скрипта у меня тоже была такая вещь:

if($currentTime - $settings->lastHarvestIncrease > 3)
{
    foreach($mapHarvests as &$section)
        if($section[$timeToHarvest] > 1)
            $section[$timeToHarvest] --;

    $settings->lastHarvestIncrease = $currentTime;
    $settings->save();
}

Похоже, что изменение section на section2 дало правильный результат. $section был использован только в этих двух разделах, которые находятся в противоположных углах, и область видимости должна была быть другой, но я думаю, я не понял, как работают ссылки.

...