【问题标题】:for loop on huge number对大量数字进行 for 循环
【发布时间】:2015-02-24 07:54:36
【问题描述】:

PHP

$SCode=$_POST['SCode'];
$ECode=$_POST['ECode'];

for($p=$SCode;$p<$ECode;$p++)
{
    $dbResult= $dbHandle->query("
    SELECT Code
    FROM Mashaghel 
    Where Code=" . $p . "");
    if(!isset($Mashaghel[0]["Code"]) || empty($Mashaghel[0]["Code"]))
    {
        $errorCode.=$p."،";
    }
}
echo $errorCode."does not existed!";

我用

运行这个
$_POST['SCode']='010100100101002084';
$_POST['ECode']='010100100101002087';

但这不起作用并说错误Maximum execution time of 60 seconds exceeded010100100101002084010100100101002087 之间的区别只有3。

为什么 for 循环会无限循环!?

请帮帮我

【问题讨论】:

  • 不应该是$Mashaghel$dbResult
  • 您意识到像010100100101002084 这样的值太大而无法表示为 32 位有符号整数(猜测您正在运行 32 位 PHP);再加上你在将它们转换为数字时会丢失前导零
  • @MarkBaker 对于对于整数来说太大的数字,它不会切换到浮点数吗?
  • 为什么不直接使用WHERE Code BETWEEN $SCode AND $ECode 并循环遍历结果?
  • 是的,它会做那个切换,但是你可能会进入浮动不准确的领域

标签: php for-loop numbers


【解决方案1】:

改变

 for($p=$SCode;$p<$ECode;$p++)

for($p=0; $p < ($ECode - $SCode - 1); $p++)

并且在循环内对$p 的引用指向$p+$SCode

【讨论】:

  • echo (string)$p+$SCode return 1.0100100101002E+16 如何得到正确的格式意味着 010100100101002086
  • 它不应该工作。$ECode - $SCode 将产生 4 但它应该是 3
  • 检查更多。差是3,但它不产生3。它产生4
  • @ShaifulIslam rights,$p+$SCode 返回错误值,此返回所有时间 1.0100100101002E+16
【解决方案2】:

将 for 的限制打破为两个数字。例如,认为您的 for 循环限制数为 1000 将其分解为 100,10 使 2 嵌套 for 循环。

对于一些不可分割的数字,你可以一个接一个地做一些 for 循环,例如认为你的数字是 11 做 5+6 就像你有 2 个 for 循环在循环中精确地彼此运行一样。 你也可以测试while循环。

毕竟我不认为这是一个解决方案,它只是一种临时解决问题的方法。

【讨论】:

    【解决方案3】:

    试试这个

    for($p=0;$p<bcsub($ECode,$SCode);$p++)
        {
            $dbResult= $dbHandle->query("SELECT Code FROM Mashaghel
    Where Code=" . bcadd($SCode,$p) . "");
            if(!isset($Mashaghel[0]["Code"]) || empty($Mashaghel[0]["Code"]))
            {
                $errorCode.=bcadd($SCode,$p)."،";
            }
        }
    

    【讨论】:

      【解决方案4】:

      脚本执行这么长时间的原因可能是循环内的查询。您可以尝试将“LIMIT 1”添加到您的查询中,以便它只处理一行或将 1 更改为您需要处理的行数。 如果您仍然想让您的脚本能够执行更长的时间,这里有更多关于它的信息。默认情况下,PHP 会在 60 秒后终止脚本以防止脚本挂起。 php.ini 中有一个值定义了 PHP 脚本可以运行的最长时间 - 它称为 max_execution_time。您还可以通过 running set_time_limit() 函数 (docs) 更改特定脚本的此值。

      【讨论】:

      • 为什么 3 个简单的 SQL 查询会花费一分钟多的时间?在@stony 的回答中查看我的 cmets。
      • 编辑了我的答案。也许查询只需要处理一行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      相关资源
      最近更新 更多