【问题标题】:php looping issuephp循环问题
【发布时间】:2011-10-19 18:56:39
【问题描述】:

我需要你的帮助来解决循环问题,当大脑停止运作时会很烦人。

这就是我想做的:

  1. 我有一个包含一些数据的数组,在这种情况下可以说 [6]

  2. 从这个数组的长度我创建了一定数量的div。每个 div 最多可以保存 5 个数组值。因此,将创建的 div 数 = round(sizeof array/5),在这种情况下为 2 个 div。

到目前为止一切都很好,但现在我无法弄清楚。如何创建在 div 1 中打印出索引 0-4 的循环,然后继续创建第二个 div 以打印出索引 5-6 in。

当然,它应该是动态的,所以如果我在数组中有 20 个值,它将创建并用这些值填充 4 个 div。

提前致谢!

编辑:感谢大家的解决方案!

【问题讨论】:

  • div will hold a maximum of 5 array values 请解释一下那句话。据我所知div 是 HTML 标签,div 不能存储数组值
  • 抱歉,该数组包含许多应该填充 div 的值,但一个 div 应该只能容纳 5 个“行”(或值)所以假设该数组包含 6 个名称.然后第一个 div 应该用 5 个名字填充,第二个 div 用最后一个,第六个,名字

标签: php mysql arrays loops


【解决方案1】:

看看array_chuck,它把数组分成几部分 http://php.net/manual/en/function.array-chunk.php

// sample data
$rows = array('a','b','c','d','e','f');

$chunks = array_chunk($rows, 3); // ajust to suit number of rows per chunk

foreach ($chunks as $chunk):
  echo '<div>';

  foreach ($chunk as $row):
    echo $row;
  endforeach;

  echo '</div>';
endforeach;

【讨论】:

  • 谁通过并否决了所有这些帖子? array_chunk 是解决此问题的一种方法。
  • 感谢保险杠。哪种解决方案最有效? array_chunk 有什么缺点吗?
  • array_chunk 让您可以使用foreach,它比for 循环干净得多。
  • @Josef 使用 array_chunk、array_splice 等的答案效率略低,因为它们将数组复制到内存中(一次 5 位)。但除非您正在处理数千个值,否则您可能看不到效率的太大差异。选择最容易理解和维护的解决方案。
【解决方案2】:

警告:未经测试的代码。不过试试这个。

$perRow = 4;
$myContentArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$total = count($myContentArray);
$maxDivs = 3;

for($i = 0, $c = 0; $i < $total && $c <= $maxDivs; $i += $perRow + 1, $c++)
{
    echo '<div>';
    for($j = $i; $j <= $i + $perRow && $j < $total; $j++)
    {
        echo $myContentArray[$j] . ' ';
    }
    echo '</div>';
}

打印出来:

1 2 3 4 5
6 7 8 9 10

【讨论】:

  • 嗯,这几乎奏效了。但对我来说,它打印出
    1 2 3 4 5
    5 6 7 8 9
    9 10
  • 像魅力一样工作!谢谢。添加相同的机制来控制创建的 div 的数量是否容易?假设我只允许它最多创建 5 个填充的 div?从那里我可以继续分页。因此,如果数组包含 30 个值,则只有 25 个会显示在 5 个 div 中。
  • 更新了 $maxDivs 字段,限制了要输出的 div 的数量。
  • 这很漂亮,而且我可以联系到代码。再次感谢 SpikeX!
【解决方案3】:

伪代码:

  1. 使用计数器循环数组
  2. 如果计数器 = 0 或可被 5 整除,则打开 &lt;div&gt;
  3. 打印数组项

注意: 确定&lt;div&gt; 是否打开以检查何时关闭的标志通常很有帮助。在第 2 步和循环之后执行此操作。

【讨论】:

  • 这听起来很乱。为什么不只使用两个嵌套循环?
  • 也许,但我的只是一个循环。 :)
【解决方案4】:
    <?php
    $data = array(1, 2, 3, 4, 5, 6);

    echo '<div>';
    for($i=0;$i<count($data);$i++) {
        if ($i && $i % 5 == 0) {
            echo '</div><div>';
        }
        echo "$data[$i] ";
    }
    echo '</div>';
    ?>

【讨论】:

    【解决方案5】:

    最快最简单的解决方案

    $array = Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
    
    for($i = 0 ; $i < count($array) ; $i += 5) {
        echo "<div>".join(" | ", array_slice($array, $i, 5))."</div>";
    }
    

    循环:从数组中取出 5 个元素,放入 div 中,并用 ' | 连接它们。 '

    Working example

    【讨论】:

    • 很好的例子,如果你不需要索引(这可能是 OP 的想法)。无论如何,你应该缓存count()结果(在循环之前计算它,否则它会每次都执行并且可能会严重减慢脚本,例如当用于实现CountableIterable接口的某些特定对象时) .
    • 检查这个host9.info/arrdiv2.php - 数组[1..100000]。这就是为什么我不缓存count() 结果:) 没关系...
    • @PeterSzymkowski 我以前从未费心对 count() 进行基准测试,这是了解的好信息
    • @Peter,你在说什么?您的基准测试显示缓存计数在三分之一的时间内运行。
    • @PeterSzymkowski:你可能不知道count() 函数依赖于传递对象的count() 方法,如果它实现Countable 接口,那么你的基准测试就大错特错了。供您参考:count() 可能正在调用处理密集型操作。这是我的答案比你的好很多的地方(而且更灵活,如我的代码第三行所述)。
    【解决方案6】:

    已经有多种解决方案。我的经过测试和工作,每 5 个数据元素使用一个容器:

    <?php
    
    // any iterable data, not necessarily array
    $data = array('a','b','c','d','e','f','g','h','i','j','k','l','m');
    
    $counter = 0;
    
    foreach ($data as $data_part) {
        if ($counter % 5 === 0) {
            echo '<div>'; // open container (div?) here
        }
        echo '(' . $counter . ':' . $data_part . ')';
        if ($counter % 5 === 4) {
            echo '</div>' . PHP_EOL; // close container (div?) here
        }
        $counter++;
    }
    
    if ($counter % 5 !== 4) {
        echo '</div>' . PHP_EOL; // close container (div) here, because unclosed
    }
    

    要查看它的实际效果(&lt;div&gt;&lt;/div&gt; 分别替换为 [])只需点击链接:http://codepad.org/GjMhiX5y

    【讨论】:

    • @PeterSzymkowski 想说明为什么这是一场灾难。毫无道理地称其为灾难并不能帮助任何人学习
    • 哇,这方式的代码比你需要的多。太冗长了。
    • @PeterSzymkowski:不要抱歉,只要给出一些你认为这是一场灾难的理由。有什么建设性的(比如我对您刚刚发布的解决方案的批评)?
    • 我非常感谢这个网站。在几分钟内,您将获得五个答案和五个不同的解决方案。我认为这很棒!这也确实有效。非常感谢。
    • @Josef 并非总是如此……这只是一个非常简单的问题,很多人都知道如何解决。如果您问一些技术上非常复杂的问题,您会很幸运能在 24 小时内得到一个答案。
    【解决方案7】:

    使用取模运算符 (%) 检查一个数是否可​​以被另一个数整除。在这种情况下,$x % 5 == 0 表示 if the remainder of $x divided by 5 is equal to 0

    <?php
    
    $data = array("1","2","3","4","5","6","7","8","9","egg");
    
    echo "<div>";
    for($x=0; $x<count($data); $x++) {
        echo $data[$x];
        if ($x > 0 && $x % 5 == 0) {
            echo "</div><div>";
        }
    }
    echo "</div>";
    
    ?>
    

    编辑:为了回应您的评论,我应该这样写:

    <?php
    
    $data = array("1","2","3","4","5","6","7","8","9","egg");
    
    echo "<div>";
    for($x=1; $x<=count($data); $x++) {
        echo $data[$x-1];
        if ($x % 5 == 0) {
            echo "</div><div>";
        }
    }
    echo "</div>";
    
    ?>
    

    注意for循环声明的变化,我如何访问$data的数组元素的变化,以及对循环内条件的修改。

    【讨论】:

    • 这给了我第一个 div 中的 6 个数字和第二个中的 4 个数字。但也许我可以玩弄这个。
    • 啊,是的,我应该注意到我没有测试代码。我对我的帖子进行了编辑以显示修复它的方法。
    【解决方案8】:

    也就是说,你想把一维数组转换成二维数组,像这样:

    $array_one = array("A", "B", "C", "D", "E", "F", "G", "I");
    $counter1 = 0;
    $counter2 = 0;
    foreach($array_one as $e) {
      $array_two[$couter1][$couter2] = $e;
      if($counter2==4) {
        $counter1++;
        $counter2 = 0;
      }
      else {
        $counter2++;
      }
    }
    

    或更简单:

    for($i = 0; $i<count($array_one); $i++)
      $array_two[$i/5][$i%5] = $array_one[$i];
    

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 2012-07-23
      • 2014-09-03
      • 2020-06-20
      • 2012-02-24
      • 1970-01-01
      • 2011-07-01
      • 2013-12-10
      相关资源
      最近更新 更多