【问题标题】:Random number of divs with random number of elements with PHP带有随机数元素的随机 div 与 PHP
【发布时间】:2010-12-29 10:34:15
【问题描述】:

我需要从随机数 $totalItems 生成随机数的 div,每个 div 有五个项目(以及最后一个 div 中的剩余项目),而且并非所有项目都满足 $OKItems... 希望代码比我解释得更好.

我的问题是这个脚本生成了没有内容的空 div。

<?php

  $OKItems = 0;
  $totalItems = rand(2,30);

  for ($i = 0; $i < $totalItems; $i++) { 
    echo ($OKItems == 0 || $OKItems % 5 == 0) ? 'div open<br />' : '';

    $testValue = rand(0, 1);
    if ($testValue != 0) {
      echo '1'; 
      $OKItems++;
    }

    echo ($OKItems % 5 == 0 || $i+1 == $totalItems) ? '<br />div close<br />' : '';
  } 

?>

这是我可能得到的:

div open

div close
div open
11111
div close
div open

div close
div open

div close
div open
11
div close

这就是我在这种情况下想要的:

div open
11111
div close
div open
11
div close

【问题讨论】:

  • 请选择一个给定的答案并接受它

标签: php random for-loop


【解决方案1】:
<?php

const N = 5;
$totalItems = rand(2,30);

$items = array() ;
for ($i = 0; $i < $totalItems; $i++) { 
    $testValue = rand(0, 1);
    if ($testValue != 0) {
      $items[] = 1 ;
    }

    if( N == sizeof($items) || (($i == $totalItems - 1) && 0 < sizeof($items))  ) {
        echo "<div>" . join(",", $items) . "</div>";
        $items = array() ;
    }
} 

【讨论】:

  • @ajreal 我已经测试了代码,在发布 cmets 之前你也应该这样做。如果您仍然认为它不起作用,您可以在&lt;?php 之后添加error_reporting(E_ALL)
  • @St.Woland - const 仅用于课堂,不适用于程序
  • 谢谢,我采用了这个解决方案,因为它最容易在我现有的实际代码中实现。
  • @ajreal 好的抱歉,下次更清楚。我使用const 是为了便于理解,而不是为了标记。您可以在实际应用程序中使用define 甚至变量。
【解决方案2】:

我认为您的代码需要更多结构。

我的方法是将其分成几个阶段,而不是尝试在输出数据的循环中执行所有逻辑。

我的建议:

  1. 确定要测试的项目数
  2. 测试每个项目,只复制传入新数组的项目
  3. 将此新数组分成 5 个一组
  4. 将每个分区输出为一个div

代码(未经测试):

// Decide how many items to test
$totalItems = rand(2,30);

// Test these items and add them to an accepted array
$items = Array();
for ($i = 0; $i < $totalItems; $i++) { 
  $testValue = rand(0, 1);
  if ($testValue != 0) { $items[] = "1" }
}

//Partition them into sections
$partitions = array_chunk($items,5);

//Output as divs
foreach($partitions as $partition):
  echo 'div open <br />';
    foreach($partition as $item):
      echo $item . "<br />";
    endforeach;
  echo 'div close <br />';
endforeach;

当您将代码拆分为逻辑步骤时,维护和调试会变得更加容易。

【讨论】:

  • 感谢您的精彩回答。这本来可行,但@St.Woland 提供的解决方案更容易在我的实际现有代码中实施。
【解决方案3】:
<?php
$OKItems = 0;
$totalItems = rand(2,30);

for ($i = 0; $i < $totalItems; $i++) { 
  echo ($OKItems == 0 || $OKItems % 5 == 0) ? 'div open<br>' : '';

  $testValue = rand(0, 1);
  if ($testValue != 0) {
    echo '1'; 
    $OKItems++;
  }

  if($OKItems % 5 == 0 || $i+1 == $totalItems) {
      echo '<br>div close<br>';
      $OKItems = 0;
  }
} 

?>

这应该可以工作;)

我将您的检查行更改为 if 函数,该函数也会重置您的 $OKItems。你遇到的问题(我认为)是你得到一个 0 作为随机值,这会使 $OKitems 保持在 5 上。

【讨论】:

  • 对此进行了简要测试,这也使 div 为空。无论如何谢谢你 - 至少我的问题得到了解决。 :)
猜你喜欢
  • 2016-01-24
  • 2012-05-05
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多