PHP - Tricky ...数组到列中,但按特定顺序排列

时间:2010-03-24 06:34:48

标签: php

<?php

$combinedArray = array("apple","banana","watermelon","lemon","orange","mango");


        $num_cols = 3;

        $i = 0;
        foreach ($combinedArray as $r ){
            /*** use modulo to check if the row should end ***/
            echo $i++%$num_cols==0 ? '<div style="clear:both;"></div>' : '';
            /*** output the array item ***/
    ?>
        <div style="float:left; width:33%;">
    <?php
            echo $r;
    ?>
        </div>
    <?php
        }
    ?>
    <div style="clear:both;"></div>

上面的代码将打印出如下数组:

苹果---香蕉---西瓜

柠檬---橙色---芒果

但是,我需要这样:

苹果---西瓜---橙色

香蕉---柠檬---芒果

你知道怎么转换吗?基本上,数组中的每个值都需要放在上面的一个下面,但它必须基于3列的相同结构,并且每列/行也有相同数量的水果(除非有7个水果,否则会有3列在一列中,2列在其他列中。

对不起,我知道这让人困惑lol

5 个答案:

答案 0 :(得分:1)

你为什么不做你想做的事情?我的意思是在列中显示它们而不是行?

$combinedArray = array("apple","banana","watermelon","lemon","orange","mango");
$num_cols = 3;
$rowCount = ceil(count($combinedArray)/$num_cols);
$i = 1; // in order the modulus to work correctly

?>
<div style="float: left; width:33%"> <!-- this is the first column -->

foreach ($combinedArray as $r ){
   ?>

   <div> <!-- just a div containing $r -->
      <?php
         echo $r;
      ?>
   </div>
<?php

   // this is where the magic happens
   // check if we have enough rows and start another column
   if ($i % $rowCount == 0) {
      ?>
      </div> <!-- close the previous column and start a new one -->
      <div style="float: left; width:33%"> <!-- this is the new column -->
      <?php
   }

   $i++;
}
?>
</div> <!-- closing the last open column -->
<div style="clear:both;"></div>

这应该只做你想要的工作。如果你只想使用没有div的表格,马文的答案会更好。

答案 1 :(得分:1)

感谢大家的帮助......我意识到了更好的方法。简单来说,我有3列浮动在彼此旁边。在每一列中,我都会在其中添加一个项目列表,并在每行达到最大项目时停止。

工作代码:

<div style="float:left; width:33%;">
<?php

        $combinedArraySizeOf = sizeof($combinedArray);
        $num_cols = 3;
        $iPerRow = $combinedArraySizeOf / $num_cols;

        for ($i=0; $i!=$combinedArraySizeOf; $i++){

            if ($i % $iPerRow == 0){
                echo '</div><div style="float:left; width:33%;">';
            }

            echo $combinedArray[$i]."<br />";

        }
?>
</div>
<div style='clear:both;'></div>

如果有必要,不要忘记在最后清除它们:P

答案 2 :(得分:0)

$combinedArray = array("apple","banana","watermelon","lemon","orange","mango");

    $step = 2;
    $i = 0;
    $new_array = array();

    foreach ($combinedArray as $r ){
        $remainder = ($i % $step);
        $new_array[$remainder][] = $r;
        $i++;
    }

    foreach($new_array as $array)
    {
        echo implode(' --- ', $array)."<br>";
    }

答案 3 :(得分:0)

这会有用吗?

$combinedArray = array("apple","banana","watermelon","lemon","orange","mango");
$num_cols = 3;
$rows = ceil(count($combinedArray)/$num_cols);

for($i = 0; $i < $rows; $i++){
    for($j = 0; $j < $num_cols; $j++){
        echo $combinedArray[(($i+$j) * $rows)-$i];
    }
echo "<br />";
}

这还需要检查在项目数量不能被列数精确整除的情况下存在的值,您可以通过以下更改来实现:

$combinedArray = array("apple","banana","watermelon","lemon","orange","mango");
$num_cols = 3;
$rows = ceil(count($combinedArray)/$num_cols);

for($i = 0; $i < $rows; $i++){
    for($j = 0; $j < $num_cols; $j++){
        $cell = (($i+$j) * $rows)-$i;
        if($cell > count($combinedArray)) break;
        echo $combinedArray[$cell];
    }
    echo "<br />";
}

答案 4 :(得分:0)

如果这个顺序是您理想的顺序,但它在所有浏览器中都有效并不重要,也许您应该查看coloumn layout(仍然是非常实验性的css3草案)。如果您对每个coloumn中的元素使用dispay内联块,则您将当前订单作为后备。

您也可以使用表格进行布局并使用类似于此的for循环(伪PHP代码,自从我编写任何php以来已经有一段时间了):

maxHeight = Math.ceil(array.length / 3) // meaning length=6 will give 3, 
                                         // length=7 will give 4
$x = -1; // horizontal index
for(i = 0; i < array.length(); i++){
   $y = i % maxHeight; // vertical index 
   if($y == 0){
      $x++;
   }
   addToTable($x,$y, array[i]);
}