我正在使用foreach循环来运行数组。有了它我有$ q在每次循环运行时迭代值为1。当值达到总数的1/3时,它将回显新的div,以便生成多个列。 但我似乎无法找到错误。
$i = 0;
$count = count($segments->getItems());
$countdiv = $count / 3;
$countdiv = number_format((float)$countdiv,0,',','');
$q = 0;
foreach($segments->getItems() as $segment)
{
$q++;
$allusers = 0;
if($segment->getName() === 'All Users') {
$allusers = "checked";
}
?>
<label class="custom-control custom-checkbox">
<input type="checkbox" name="<?php echo $segment->getName();?>" value="segments[]" class="custom-control-input" <?php echo $allusers?>>
<span class="custom-control-indicator"></span>
<span class="custom-control-description"><?php echo $segment->getName();?></span>
</label>
<?php
if($q === $countdiv)
{
?>
</div>
</div>
<div class="col-md-6">
<div class="custom-controls-stacked">
<?php
}
}
答案 0 :(得分:1)
number_format()
会返回该数字的格式化字符串。因此,当您使用===
将字符串与实际数字进行比较时,它始终为false,因为字符串类型永远不能严格等同于数字类型。此外,它只会在第一次工作时$q
总是在增加。
正如@Chris Forrence建议您可以这样做:
if(($q % round($count / 3)) === 0)
让我们深入了解一下。首先,我们将$count
除以3,因为我们需要三列。我们不能将项目的一小部分分开,所以让round
得到一个整数。然后我们使用它来取%
的模($q
)。这只是说除x / y
,而不是结果,给我余数。因此,每当$q
是$count / 3
的倍数时,这将返回0.因此,如果我们测试整个计算以查看它是否等于0
,那么我们将知道我们何时我们打了一个列边界。
如果您在大量对象上循环并且性能成为问题,请将您的$countdiv
声明更改为:
$countdiv = round($count / 3)
然后上面的if语句可以缩减为:
if(($q % $countdiv) === 0)