【问题标题】:Is my modulus logic for this loop correct?我这个循环的模数逻辑是否正确?
【发布时间】:2011-08-22 02:15:54
【问题描述】:

这就是我正在寻找的模式

在一个有限集合中,我想为一个集合检索前 2 个值,然后为另一个集合检索下一个 4 个值,然后为第一个集合检索 2 个值,然后为另一个集合检索 4 个值,依此类推。 .

抢 2 |抢4 |抢 2 |抓4 ...

$count = 0;
foreach ($listing as $entry){
  if ($count % 4 == 0){
       // add to 4-item set
  } else if ($count % 2 == 0){
       // add to 2-item set
  }
  $count++;
}

我的困惑是,当 $count%4=0 时,$count%2 也将 = 0。

那么我是否应该通过检查 first if $count%4 == 0 来确保不达到错误的模数情况(因为对于任何可被 4 整除的任意数,两者都是正确的)?

【问题讨论】:

  • 我假设,根据您对foreach 的使用,您的代码仅适用于 PHP。为什么是 javascript 标签?你也想要等效的代码吗?
  • 因为两者的逻辑是一样的。
  • 为什么不在 foreach 循环中选择 6 个值,直接将前两个放入第一组,将其他 4 个放入另一组?大大简化了事情:)
  • 我不知道为什么模数很重要...如果你想选择 2 项,然后是 4 项,然后是 2 项,只需数到 2,然后数到 4,然后数到 2 . 你这样做的方式,你的两个条件之一将在你的循环结束之前每隔一个数字都为真。
  • 模数很重要,因为它可以用模数来完成,而且对于我试图调节的方法来说,它更干净,没有理由不问一个困难的问题来安抚一个更简单的场景。这就是编程的全部意义,不是吗?

标签: php javascript loops logic


【解决方案1】:

如果我猜对了,你想要的分布实际上是:

A A, B B B B, A A, B B B B, A A, B B B B, ...

所以你想将它们分成六个,然后将前两个放入晒太阳的 A 中,其他四个放入 B:

if ($count % 6 < 2){
   // add to 2-item set
}
elseif ($count % 6 < 6){
   // add to 4-item set
}

将其拆分为 if/elseif 将确保项目仅以任一方式结束。 &lt; n% 6 分布的比较意味着:

$count % 6 =    0  1  2  3  4  5  0
        if =   <2 <2 <6 <6 <6 <6 <2
    basket =    A  A  B  B  B  B  A

【讨论】:

  • 正是我想如何订购我的结果。我认为这是我需要的确切模数排序
  • 马里奥谢谢!!你的编辑正是我要计算的,ty ty ty +1
  • 我总是在纸上为这些东西画图。这通常使解释条件不那么混乱。
  • 然而——你在第一个例子中反转了你的 php cmets 吗?不应该反过来吗?
  • 是的,来自复制和粘贴。我希望没有人会注意到 cmets.. :}
【解决方案2】:

不正确

当计数为 2、8、14 等时,你应该抓住设置 1

目前您正在抓取计数为 2、4、8 等时

当计数为 6、12、18 等时设置为 2

目前是计数为 4、8、12 等时

所以条件1是((count-2) % 6) == 0

而条件2是(count != 0) &amp;&amp; (count % 6) == 0

这是应该起作用的东西

$count = 0;
foreach ($listing as $entry){
  if ($count < 2){
       // add to 2-item set
  } else {
       // add to 4-item set
  }

  if ($count < 6) $count++; 
  else $count = 0;
}

或者,如果您想一次抓取 2/4 件物品:

$count = 0;
foreach ($listing as $entry){
  if ($count == 2){
       // add 2 items to 2-item set
  } elseif ($count == 6) {
       // add 4 items to 4-item set
  }

  if ($count < 6) $count++; 
  else $count = 0;
}

【讨论】:

  • 谢谢 ariel -- 这个逻辑会起作用,但我真的只是在寻找一个模数比较器,感谢 +1 提供另一种想法。
【解决方案3】:

由于您指定的确切原因,这不起作用。

可以实现的方法是

  1. 使用 6 的模数,然后每次模数为 6 时,将从 count - 6 开始的前两个元素添加到 set1,接下来的 4 到 set2。
  2. 使用布尔开关,当开关为真时,将元素添加到set 1,在4个元素之后将开关设置为false,当开关为假时,将元素添加到set2,当你是完成向 set2 添加元素。

【讨论】:

  • 嗯,这是一个选项,但我更喜欢用简单的模数保持干净
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多