gpt4 book ai didi

php - 重新打开 : PHP array_shift(); VS reset(); unset(); array_splice();

转载 作者:可可西里 更新时间:2023-11-01 12:59:15 25 4
gpt4 key购买 nike

重新开放:

因为 PHP 是一种服务器端语言,所以我假设我使用的浏览器并不重要,但显然不是这样。我一直只使用谷歌浏览器。

我在我的本地机器上安装了 WAMP,所以我可以在本地测试它,看看它是否与我的共享主机帐户一样。两种代码都按它们应有的方式工作(在 Chrome 中请注意)。然后我在我的共享主机上查看了完全相同的代码——一个有效,另一个无效。

我调用我的共享主机支持,他们试图重现这个问题,但说他们没有找到。所以我在 Firefox 和 IE 中尝试了它,你瞧......它在两者中都完美运行,就像在 WAMP 上一样。

这对我来说仍然没有多大意义。我在一家知名托管公司的共享托管帐户上使用 PHP 5.3,但没有取得任何进展,因为他们无法真正排除代码故障。他们可以复制问题,但无法回答原因。我将在接下来的几周内尝试了解更多信息,并在我了解更多信息后发布更新。

我想做的是:

  • 生成一系列数字
  • 将它们随机排列
  • 将该随机排列的数字数组复制到 session 数组中
  • 获取数组的第一个值,删除那个值,然后全部移位值下降一

这是我的问题:

我尝试使用 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); 的替代品它奏效了!然后我试着并排比较它们并清理了代码,现在他们正在做相反的事情。有时reset、unset、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 />";

}
?>

最佳答案

为了最终了解发生了什么,我建议 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 );

虽然还有其他方法可以追踪问题,但这个方法不需要外部基础设施

关于php - 重新打开 : PHP array_shift(); VS reset(); unset(); array_splice();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com