重新打开:PHP array_shift(); VS reset(); 未设置(); array_splice();

Jef*_*ves 7 php reset unset

重新打开:

由于PHP是一种服务器端语言,我假设我使用的浏览器并不重要,但显然不是这样.我只使用过谷歌浏览器.

我在本地计算机上安装了WAMP,因此我可以在本地测试它以查看它是否与我的共享主机帐户相同.这两个代码都按照他们应该的方式工作(在Chrome中你会想到).然后我查看了共享主机上完全相同的代码 - 一个有效,另一个没有.

我打电话给我的共享托管支持,他们试图复制该问题,并表示他们没有找到它.所以我在Firefox中试了一下它们就行了,在IE浏览器中,看到它......就像WAMP一样,它们都很完美.

这对我来说仍然没有多大意义.我在我的共享主机帐户上使用PHP 5.3与一个知名的托管公司,但没有到达任何地方因为他们无法真正解决代码问题.他们可以复制问题,但无法回答原因.我将在接下来的几周内尝试查找更多内容并发布更新,因为我知道更多.

我想要做的是这样的:

  • 生成一系列数字
  • 将它们随机播放
  • 将随机排序的数字数组复制到会话数组中
  • 获取数组的第一个值,删除该值,并将所有值向下移动一个

这是我的问题:

我尝试使用array_shift();,它在第一次运行时工作正常,但每次我运行代码后,它将删除前两个元素.

为了测试发生了什么我尝试先打印数组array_shift();,然后再打印数组,看看发生了什么.

预期成绩:

运行#1:

[0]=>5 [1]=>2 [2]=>1 [3]=>4 [4]=>3  //print_r($array);
                                    //execute array_shift($array);
[0]=>2 [1]=>1 [2]=>4 [3]=>3         //print_r($array);
Run Code Online (Sandbox Code Playgroud)

运行#2:

[0]=>2 [1]=>1 [2]=>4 [3]=>3         //print_r($array);
                                    //execute array_shift($array);
[0]=>1 [1]=>4 [2]=>3                //print_r($array);
Run Code Online (Sandbox Code Playgroud)

实际结果:

运行#1:

[0]=>5 [1]=>2 [2]=>1 [3]=>4 [4]=>3  //print_r($array);
                                    //execute array_shift($array);
[0]=>2 [1]=>1 [2]=>4 [3]=>3         //print_r($array);
Run Code Online (Sandbox Code Playgroud)

运行#2:

[0]=>1 [1]=>4 [2]=>3                //print_r($array);
                                    //execute array_shift($array);
[0]=>4 [1]=>3                       //print_r($array);
Run Code Online (Sandbox Code Playgroud)

我的问题(续)

那么我尝试使用reset($array);,unset($array[0]);并array_splice($array,1,0);作为array_shift($ array)的替代品; 它工作了!然后我尝试将它们并排比较并清理代码,现在它们正在做彼此相反的事情.有时重置,取消设置和array_shift; 当调用一次时,甚至会跳过数组中最多7个单元格.array_shift();正在以我想要的方式工作,但我想知道原因.这让我疯了!如果有人能帮助我,我会非常感激.

代码转储:

未设置,重置,拼接

<?php
session_start();
$min = A; 
$max = S;

if((!isset($_SESSION['image'])) || ($_SESSION['image'] == null))
{
$numbers = range($min, $max);  //set a range for all images 
shuffle($numbers); //shuffle the order for randomness

$_SESSION['image'] = $numbers;

echo "<br />Current value: " . $_SESSION['image'][0] . "<br />";
print_r($_SESSION['image']);

reset($_SESSION['image']);
unset($_SESSION['image'][0]);
array_splice($_SESSION['image'],1,0);
echo "<br />New value: " . $_SESSION['image'][0] . "<br />";
echo "<br />1st exec<br />";

}
else
{
echo "<br />Current value: " . $_SESSION['image'][0] . "<br />";
print_r($_SESSION['image']);



reset($_SESSION['image']);
unset($_SESSION['image'][0]);
array_splice($_SESSION['image'],1,0);
echo "<br />New value: " . $_SESSION['image'][0] . "<br />";
echo "<br />2nd exec<br />";

}
?>
Run Code Online (Sandbox Code Playgroud)

转移

<?php
session_start();
$min = A; 
$max = S;

if((!isset($_SESSION['id2'])) || ($_SESSION['id2'] == null))
{
$numbers = range($min, $max);  //set a range for all images 
shuffle($numbers); //shuffle the order for randomness

$_SESSION['id2'] = $numbers;

echo "<br />Current value: " . $_SESSION['id2'][0] . "<br />";
print_r($_SESSION['id2']);

array_shift($_SESSION['id2']);
echo "<br />New value: " . $_SESSION['id2'][0] . "<br />";
echo "<br />1st execution<br />";

}
else
{
echo "<br />Current value: " . $_SESSION['id2'][0] . "<br />";

print_r($_SESSION['id2']);

array_shift($_SESSION['id2']);
echo "<br />New value: " . $_SESSION['id2'][0] . "<br />";
echo "<br />2nd execution<br />";

}
?>
Run Code Online (Sandbox Code Playgroud)

Ste*_*eAp 2

为了最终了解发生了什么,我建议注册一个 tick-function。tick-function可以在每次 PHP 语句执行时执行。

这是一个简单的,它跟踪每个语句的行/文件(随意添加更多详细信息):

// Execute at each single statement
declare(ticks=1);

// Function to get called at each executing statement    
function logEachStatement() {

  $traceInfo = debug_backtrace();
  $lastActivation = $traceInfo[ count( $traceInfo ) - 1 ];

  $info = "\n" 
        . $lastActivation[ 'line' ]  . '@' . $lastActivation[ 'file' ] 
        ;

  $targetFile = dirname( __FILE__ ) . '/stmnt.log' );

  file_put_contents( $targetFile, $info, FILE_APPEND );

}

// using a function as the callback
register_tick_function( 'logEachStatement', true );
Run Code Online (Sandbox Code Playgroud)

虽然还有其他选项可以追踪问题,但此选项不需要外部基础设施。