0

假设以下

  1. 我在列表中有 n 个对象
  2. 对象按顺序处理
  3. 我想在超过一定数量时显示完成百分比

例如,

我有 2204 个对象,一旦它处理了 221 个对象,我希望它显示 10%,然后一旦它处理了 441 个对象,我希望它显示 20%。本质上是为了让我有一个队列在哪里的指导方针。

用php写这个我有以下内容:

$i = 0;
$total = 2204 // result of getTotal();

foreach (range ($i, $total) as $i ) {
    //do some irrelevant processing
    if (($i/$total*100)%10 == 0) {
        echo number_format(($i/$total*100),0)."% done.\n";
    }
}

但是我的结果集不太理想,我得到以下输出:

0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.

我将如何做到这一点?

4

3 回答 3

1

我在这里看到的逻辑还有另一个问题:

由于您在此列表中增加 +1,因此您不会得到精确的 10%、20%。例如,当我执行以下操作时:

foreach (range ($i, $total) as $i ) {
    echo $i/$total."\n";
}

你会看见

0.19555353901996
0.19600725952813
0.1964609800363
0.19691470054446
0.19736842105263
0.1978221415608
0.19827586206897
0.19872958257713
0.1991833030853
0.19963702359347
0.20009074410163
0.2005444646098
0.20099818511797
0.20145190562613

您可能希望在乘以 100 后将它们四舍五入,并维护一个单独的数组,您将在其中检查是否已经显示了这些值。

示例程序:

foreach (range ($i, $total) as $i ) {
    $val = round($i/$total*100)%10;
    $num = number_format(($i/$total*100),0);
if ($val == 0) {
    if(!in_array($num, $check)){
            $check[] =  $num;
            echo $num."% done.\n";
    }
}
}
?>
于 2013-10-24T17:41:59.850 回答
1
$i = 0;
$total = 2204;

foreach (range ($i, $total) as $i ) {
    if ($i % floor($total/100) == 0) {
        echo number_format(($i/$total*100),0)."% done.\n";
    }
}

如果您只希望它每 10% (10,20,30...100) 并且不包含 0,您可以这样做:

$i = 0;
$total = 2204;

foreach (range ($i, $total) as $i ) {
    if ($i % floor($total/10) == 0 && $i > 0) {
        echo number_format(($i/$total*100),0)."% done.\n";
    }
}
于 2013-10-24T17:44:40.530 回答
1

我的 2p 答案是使用检查变量

<?php
$i = 0;
$total = 2204; // result of getTotal()
$boundary=10;

foreach (range ($i, $total) as $i ) {
    //do some irrelevant processing
    $ii=intval(($i/$total)*100);
    if($ii>=$boundary){
        echo $boundary . "% done.\n";
        $boundary+=10;
    }
}

?>
于 2013-10-24T18:17:46.630 回答