从PHP动态排序HTML输出

时间:2014-08-23 14:48:28

标签: php

我对PHP有一个基本的了解,但我觉得我想做的事情可以用更简单的方式完成。我正在使用PHP来显示Wordpress主题的HTML内容。我希望用户能够确定HTML"阻止"的顺序。显示。目前我正在使用if/elseif设置。这是一个过于简化的例子:

if ( $layout == 'layout_one' ) {
   echo '<div class="header">Header</div>';
   echo '<div class="content">Content</div>';
   echo '<div class="footer">Footer</div>';
} elseif ( $layout == 'layout_two' ) {
   echo '<div class="content">Content</div>';
   echo '<div class="header">Header</div>';
   echo '<div class="footer">Footer</div>';
} elseif ( $layout == 'layout_three' ) {
   echo '<div class="footer">footer</div>';
   echo '<div class="header">Header</div>';
   echo '<div class="content">Content</div>';
}

现在,由于布局选项(排列)的剪切数,这种技术变成了绝对的熊。所以在我看来你会为每个HTML内容块编写一个单独的函数,然后以某种方式有另一个函数按照用户指定的顺序显示它们。或者可能将所有块放入一个数组中,然后根据布局选择重新排序数组......

无论如何,我已经碰到了如何实际做到这一点。任何指导将不胜感激。感谢

4 个答案:

答案 0 :(得分:6)

这不是一个微不足道的问题;随着布局部件数量的增加,维护变得越来越困难。但是,我将尝试为此提供一个“简单”的解决方案。

假设您有3个部分,如您的示例所示。但是这适用于N个部分。您将它们设置为数组:

$parts = [
  0 => '<div class="header">Header</div>',
  1 => '<div class="content">Content</div>',
  2 => '<div class="footer">Footer</div>'
  ]

然后,您希望以确定的方式进行组合。这就是我提出的,虽然我确定有some algorithm to do all possible combinations(算法的一个例子)所以这一步是自动的:

$layout_combinations = [
  0 => [0, 1, 2],
  1 => [0, 2, 1],
  2 => [1, 0, 2],
  3 => [1, 2, 0],
  4 => [2, 0, 1],
  5 => [2, 1, 0]
  ];

你真的有$layout == 'layout_one'吗?我们必须转换它:

$layout_number = [
  'layout_one'   => 0,
  'layout_two'   => 1,
  'layout_three' => 2,
  'layout_four'  => 3,
  'layout_five'  => 4,
  'layout_six'   => 5
  ];

要使用它,在定义上述部分后,只需执行以下操作:

$layout = 'layout_four';

if (!array_key($layout, $layout_number))
  throw new Exception('Invalid layout');

$layout_number = $layout_number[$layout];

$layout_structure = $layout_combinations[$layout_number];

foreach ($layout_structure as $part_number) {
  echo $parts[$part_number];
  }

主要优点是它非常容易扩展。如果您想要添加其他部分,只需将其添加到$parts数组,添加相应的新$layout_combinations和“english =&gt;数字”转换。

注意:如果$layout = 4代替$layout = 'layout_four',则可以阻止步骤。这是非常优选的,因为它允许您自动化,只需在$parts数组的末尾添加元素。

答案 1 :(得分:2)

这个怎么样:

<?php
$h = '<div class="header">Header</div>';
$c = '<div class="content">Content</div>';
$f = '<div class="footer">Footer</div>';

if ($layout == 'layout_one') {
    echo $h.$c.$f;
} elseif($layout == 'layout_two') {
    echo $c.$h.$f;
} elseif($layout == 'layout_three') {
    echo $f.$h.$c;
}

答案 2 :(得分:2)

为每个布局创建一个标识符,用于指示组件的顺序,例如: h_c_f表示标题,内容,页脚,c_f_h是内容,页脚,标题。

将您的部分内容存储在由相应字母索引的数组中:

$section_stuff = array(
   'h' => '<div>Header</div>',
   'c' => '<div>Contents</div>',
   'f' => '<div>Footer</div>',
);

使用布局标识符汇总输出以计算订单:

// $order is the layout name, e.g. c_f_h, f_c_h, etc.
// split $order by "_" to get the appropriate order

$ordered = explode( '_', $order );
foreach ($ordered as $section) {
    echo $section_stuff[$section];
}

显然你需要添加错误检查等等。

这种方法的优点是你可以使用类似拖放界面的东西来设置部分的顺序;标识符名称决定了布局,而不是任意值。

如果您想提前生成所有可能的布局,the PHP cookbook会提供一些合适的建议。

答案 3 :(得分:1)

切换案例可用于代替长elseif条件。因为切换比elseif有效并且将支持大量条件。切换的确切替换代码如下所示。

switch ($layout) {
    case 'layout_one':

        echo '<div class="header">Header</div>';
        echo '<div class="content">Content</div>';
        echo '<div class="footer">Footer</div>';

        break;
    case 'layout_two':

        echo '<div class="content">Content</div>';
        echo '<div class="header">Header</div>';
        echo '<div class="footer">Footer</div>';

        break;
    case 'layout_three':

        echo '<div class="footer">footer</div>';
        echo '<div class="header">Header</div>';
        echo '<div class="content">Content</div>';

        break;
}

另外一个由php include函数完成的棘手的工作手杖。您可以将模板创建为php文件,其名称与if语句中使用的名称相同,并使用include语句中的变量。示例代码如下所示。

include("/path_to/layout/".$layout.".php");

示例HTML布局如下所示,带有相关名称。

layout_one.php

<div class="header">Header</div>
<div class="content">Content</div>
<div class="footer">Footer</div>