PHP:为什么在没有赋值的情况下修改值?

时间:2019-06-29 10:13:13

标签: php arrays server command-line-interface single-threaded

基本上没有太多的事情,因为我将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 个答案:

答案 0 :(得分:2)

我发现了问题。在脚本的主循环中,我也有这个东西:

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

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

似乎将section更改为section2可以得到正确的结果。 $section仅在这两个部分中使用,它们位于相反的角落,范围应该有所不同,但是我想我不理解引用的工作原理。