【问题标题】:Incrementing number in foreach PHPforeach PHP中的递增数字
【发布时间】:2014-06-02 15:00:27
【问题描述】:

我想将键填充到数组中,但是键会递增,当满足一定数量时,它会停止并再次重复第一次递增。

我会给出代码,这样会更容易理解。

$start = 0004;
$end = 0150;
$trans = array();
for ($c = $start; $c <= $end; $c++) {
    $strpad = str_pad($c, 4, "000", STR_PAD_LEFT);
    $trans[] = $strpad;
}

$numtable = 1062;
$newarray = array();  
foreach($trans as $value) {
    $newarray[$numtable] = $value;
    $numtable++;
}
var_dump($newarray);
// output
array(147) {
  [1062]=>
  string(4) "0004"
  [1063]=>
  string(4) "0005"
  [1064]=>
  string(4) "0006"
  [1065]=>
  string(4) "0007"
  [1066]=>
  string(4) "0008"
and so on....
// end output

现在,我想要的是,当增量数达到 1100 时,它会重置为 1000 并继续递增,当再次达到 1100 时,它将重置为 1000 并再次继续。

所以,我想做的是:

$numtable = 1062;
$newarray = array();  
foreach($trans as $value) {
    if($numtable==1101){
        $numtable = 1000;
    }
    $newarray[$numtable] = $value;
    $numtable++;
}
var_dump($newarray);
// output


  array(101) {
  [1062]=>
  string(4) "0105"
  [1063]=>
  string(4) "0106"
  [1064]=>
  string(4) "0107"
  [1065]=>
  string(4) "0108"
and so on.. continue to...
  string(4) "0148"
  [1005]=>
  string(4) "0149"
  [1006]=>
  string(4) "0150"
  [1007]=>
  string(4) "0050"
  [1008]=>
  string(4) "0051"
And so on...

我的问题是: 我很确定我的第二个代码是正确的。 但是,为什么数组值以 0105 而不是 0004 开头? 而当值达到0150时,它仍然继续循环开始到0050?

我的代码有错误吗?

【问题讨论】:

  • var_Dump 第一个数组,并检查该数组中的内容?
  • 正如你在我上面的帖子中看到的,第一个数组有 array(147) { [1062]=> string(4) "0004" [1063]=> string(4) "0005"
  • 我看不到*你的数组 $trans...

标签: php foreach numbers increment


【解决方案1】:

对于此类计数问题,只需使用modulus operator

$numtable = 1062;
$numtable_min = 1000;
$numtable_max = 1101;
$newarray = array();  
foreach($trans as $value) {
    $numtable = $numtable % $numtable_max == 0 ? $numtable_min : $numtable;
    $newarray[$numtable] = $value;
    $numtable++;
}

所有的魔法都在这里:

$numtable = $numtable % $numtable_max == 0 ? $numtable_min : $numtable;

另一种理解它的方法是将变量替换为真实值,如下所示:

$numtable = 1062 % 1101 == 0 ? 1000 : 1062;

所以三进制的读取方式是这样的;为 $numtable 赋值,基于:

  • 1062 % 1101 == 0 只有当1062 的增量值达到1101 时,才会达到0
  • 如果发生这种情况,请将该值设置为 1000
  • 如果不是,则将该值设置为 1062 的值。

了解模运算符的魔力的简单方法是将% 视为计算% 左侧数字与右侧数字的余数。

所以1062 除以1101 将得到0.96457765667 的余数。但是1101 除以1101 没有余数;又名:0。所以把它推到一个三元中&你有一个很好的逻辑线来处理这种情况。

【讨论】:

  • 您好 JakeGloud,感谢您在这里的回答。模数运算符超出了我的想象,所以这里的这种方法(模数)可以用来计数或制作断线。在我试过之后。 $trans 数组起初我计算(使用计数)是 147。之后,我使用你的方法,它下降到 100。数组以键 1062 和值 0104 开头。我的问题是为什么值是 0104 而不是 0004 ?我要获取的是密钥 1062,值以 0004 开头。当密钥达到 1100 时,它将被重置并从 1000 开始,但值继续。
  • @ErickAsgardLoki 不客气!我还在答案的底部添加了对模数的解释,以帮助澄清一下。抱歉帮不上什么忙。但是,如果答案在某种程度上对您有所帮助,请务必投赞成票。
  • @ErickAsgardLoki 当您说,我的问题是为什么值是 0104 而不是 0004? 您的代码中是否还有其他内容会增加或触及该值?在我看来,您在此处展示的代码之外的某些东西可能是造成这种情况的原因。
  • @JakeGloud,我很确定,没有其他任何东西会影响 trans 数组。如果我应用模数或 if break,则值从 0104 开始。
  • @ErickAsgardLoki 我调整了我的脚本以更好地匹配你的代码,但老实说我没有看到你描述的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2021-07-31
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多