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

时间:2012-09-19 23:49:59

标签: 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);

运行#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);

实际结果:

运行#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);

运行#2:

[0]=>1 [1]=>4 [2]=>3                //print_r($array);
                                    //execute array_shift($array);
[0]=>4 [1]=>3                       //print_r($array);

我的问题(续)

然后我尝试使用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 />";

}
?>

<?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 />";

}
?>

2 个答案:

答案 0 :(得分:1)

为了最终了解正在发生的事情,我建议register a tick-function。 tick函数可以在每个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 );

虽然还有其他选项可以追踪问题,但这个选项不需要外部基础架构

答案 1 :(得分:1)

假设您粘贴了实际的代码,发生这种情况的唯一方法就是您发出了无意的中间请求。但是,我们不可能只用给定的信息来确定这种情况是什么情况或原因。

我的建议是使用您选择的浏览器开发工具(例如Firebug)并监控网络选项卡,以确保只向脚本发送一个请求。如果这不能解决您的问题,请添加一些简单的调试日志记录,例如:

$log = date('Y-m-d H:i:s')
     . ' :: Request received from '
     . $_SERVER['REMOTE_ADDR']
     . "\n";
file_put_contents('/path/to/your/log/file', $log, FILE_APPEND);

然后在测试后检查您的日志,以确保只添加了一个条目。