【问题标题】:Break PHP array into 3 columns将 PHP 数组分成 3 列
【发布时间】:2012-01-31 13:54:27
【问题描述】:

我正在尝试将 PHP 数组分成 3 列(必须是列,而不是行),所以它看起来像这样:

Item 1     Item 2     Item 3
Item 4     Item 5     Item 6
Item 7     Item 8     Item 9
Item 10................

我能想到的最好的方法是将主数组分成 3 个数组,每列 1 个,尽管我无法找到最好的方法 - 更具体地说,我可以用来生成 3 个的标准数组。

【问题讨论】:

  • 这些列中的项目应该如何排序? (应该是 123,456,789 还是 147,258,369)
  • “必须是列,而不是行”...?但是您在示例中显示 rows 数据...?
  • @deceze 想象三个 div 中的数据,每列 1 个。那不是行。
  • 您展示的数据几乎没有什么区别。常规的表格视图可以做到。你到底想达到什么目的?为什么考虑列中的数据而不是 3 列的行很重要?为什么一列必须是一<div>?为什么它必须是<div>,为什么你没有在问题中指定这个?
  • @deceze 它需要是列,而不是行,因为我要显示的是宽度相等但高度不确定的图像。想法是它们将在行中按顺序显示,但是为了使每个图像之间的垂直间隙始终相等,它们将按列分组。我没有指定它需要在 <divs> 中的事实是无关紧要的,因为我已经解释过它需要在列中,而不是行中。

标签: php arrays split break


【解决方案1】:

您可以使用array_slice 来提取数组的一部分,因此:

$newArray = array();

for($i = 0; $i < count($oldArray); $i += 3) {
    $newArray[] = array_slice($oldArray, $i, 3);
}

编辑:正如@deceze 指出的那样,这与array_chunk 的作用相同。 (我知道 PHP 会内置一些东西。)所以改用它吧!

【讨论】:

  • 虽然这显示了如何拆分数组,但它并没有解决OP的问题。
  • @deceze:这是一个答案。但是是的,我是;)
  • 问题是如何将我的数组输出为 3 列,而不是如何将其拆分为 3 个不同的数组。这是一个关于如何解决它的建议,而不是一个最佳的恕我直言。
  • 这不是他想要的。他想要第一列中的 1、4、7 和 10。
  • 这似乎是一种合理的方法,尽管这个想法是数组将包含不连续的元素,在位置 (1,4,7)(2,5,8) & (3,6, 9) 等等。
【解决方案2】:

我会用这个:

$i = 1
foreach ($array as $value) {
  if ($i % 3 === 0) {
        echo $value . '<br />';
    }
   $i++;
}

或者使用html表格时:

<table>
<tr>
   <?php 
   $i = 0;
   foreach ($array as $value) {
      if ($i % 3 === 0) {
            echo '</tr><tr>';
        }
      echo "<td>" . $value . "</td>";
      $i++;
   }
   ?>
</tr>
</table>

【讨论】:

  • 对我来说,我必须检查 $i != 0 是否与 $i % 3 == 0 一起。 (使用 === 没有用)。但是感谢您的帮助。
  • 大大节省时间,这个!刚刚将它安装在一个使用大量 jQuery 的网站上,这个解决方案在接下来的一个月让 3,000 多人(在投票页面上)非常高兴。
【解决方案3】:
$data = array(); 
$columns = 3;

echo "<table><tr>";

for($i = 0; $i < count($data); $i++)
{
 if($i%$columns == 0)
  echo "</tr><tr>";
 echo "<td>".$data[i$]."</td>";
}
echo "</tr></table>";

你去吧,当你达到你的列数时,它只会输出另一行。当数据不是 3 的倍数时,您可能需要添加一些逻辑。

【讨论】:

    【解决方案4】:

    在考虑您的问题主题时,第一印象是“专栏”,我认为您需要关注视觉方面。 “如何将您的数组显示为三列”可能是我的想法是错误的。但我想你想要那个。如果我的想法正确,请检查以下示例。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    
    </head>
    <?php
    $arr = array(1,2,3,4,5,6,7,8,9,10);
    ?>
    <body>
    <div style="width:300px">
    <ul>
        <?php foreach($arr as $itm) {?>
        <li style="list-style:none;float:left;width:80px;"><span style="font-size:36px;"><?php echo $itm;?></span></li>
        <?php }?>
    </ul>
    </div>
    </body>
    </html>
    

    【讨论】:

    • 这不是将数组显示为单列吗?
    • 没有。这三列用 CSS 控制。您不需要以编程方式执行此操作。它只是使用带有无序列表的宽度和浮动 CSS 属性。
    • 这将再次有效地产生行 - 对于我所需要的,列是它工作的唯一方式。
    • 这绝对是最好的方法,除非有一些未提及的原因导致您不能使用 div 和 float。这样做的优点是关于令人作呕的,但基本上,它更灵活、可维护、可访问、更适合 SEO 等等。
    • @pspahn。你检查过这个吗?此代码根据需要生成 3 列,因为潜水的宽度为 300 像素,列表项宽度为 80 像素。
    【解决方案5】:

    刚刚考虑了一下,这应该可以实现我想要的-尽管它是否是最快的方法,我不确定:

    $array = (1,2,3,4,5,6,7,8,9....)
    
    
    $column1 = array();
        $i = 2;
    
    foreach($array as $value) {
        if ($i++ % 3 == 0) {
            $column1[] = $value;
        }
    }
    
    
    $column2 = array();
        $i = 1;
    
    foreach($array as $value) {
        if ($i++ % 3 == 0) {
            $column2[] = $value;
        }
    }
    
    $column3 = array();
        $i = 0;
    
    foreach($array as $value) {
        if ($i++ % 3 == 0) {
            $column3[] = $value;
        }
    }
    

    编辑:尽管使用单个 foreach 循环,但与上面相同:

    $array = (1,2,3,4,5,6,7,8,9....)
    
    
        $column1 = array();
        $column2 = array();
        $column3 = array();
        $i = 2;
        $j = 1;
        $k = 0;
    
    
    foreach($array as $value) {
        if ($i++ % 3 == 0) {
            $column1[] = $value;
        }
        if ($j++ % 3 == 0) {
            $column2[] = $value;
        }
        if ($k++ % 3 == 0) {
            $column3[] = $value;
        }
    }
    

    【讨论】:

    • 请查看我的答案,因为它按照您的建议将数据输出到不同的列中。您不需要将它存储在不同的数组中,您可以在每个第 N 个元素之后开始一个新行。
    • @TJHeuvel 虽然在三列中,但这不是最终以行返回结果吗?我需要在三个单独的 div 中返回结果。
    【解决方案6】:

    使用 array_chunk 可以拆分数组:

    $rows = array_chunk($yourArray, '3'); // 3 = column count;
    foreach ($rows as $columns) {
        echo "<div class='row'>";
        foreach ($columns as $column) { 
            echo "<div class='column'>$column</div>"; 
        }
        echo "</div>";
    }
    

    【讨论】:

    • 不幸的是,array_chunk 没有按照问题中指定的顺序拆分它们。它将把 1,2,3 放在第一列。我希望 array_chunk 可以选择从左到右分发它们。
    【解决方案7】:
    header('Content-Type: text/plain');
    
    echo '<table>';
    
    $colNum = 3;
    $regNum = 10;
    
    for ($i = 1; $i <= $regNum; $i++) {
    
        if (($i % $colNum) == 1) {
    
            echo "\n\t".'<tr>';
    
        }
    
        echo "\n\t\t".'<td>'. $i .'</td>';
    
        if (($i % $colNum) == 0 or $regNum <= $i) {
    
            echo "\n\t".'</tr>';
    
        }
    
    }
    
    echo "\n".'</table>';
    

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 2017-10-04
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多