【问题标题】:what the best way to write this without repeating myself在不重复自己的情况下写这个最好的方法是什么
【发布时间】:2013-08-13 15:12:18
【问题描述】:

一个 php 文件将从一个表单中接收一个介于 1 到 30 之间的变量

 $style = $_GET['style'];

然后我想传递 $style 来帮助我选择用户选择的 css 样式,例如,如果选择的是样式 3,那么 css 样式 3 将被传递给这样的图像

<img style="<?php $choice3?>";  src="xxx.png" />

所以我目前拥有的是这个

<?php
 $style = $_GET['style'];

function choice1()
{
$choice1 = "display: block;padding:5px; etc, etc etc";
      return $choice1;      }   
function choice2()
{
$choice2 = "display: block;padding:10px; etc, etc etc";
    return $choice2;        }   
function choice3()
{
$choice3 = "display: block;padding:20px; etc, etc etc";
    return $choice3;        }   

if ($style == 1){
?>
<img style="<?php $choice1?>";  src="xxx.png" />
<?php 
}
if ($style == 2){
?>
<img style="<?php $choice2?>";  src="xxx.png" />
<?php 
}
.......and so on till 30        
?>                  

我很确定有一种更简单、更智能的方式来表达我的逻辑。

【问题讨论】:

  • 您设置的其他值是什么?也许我们能够看到一种模式。内边距始终为 * 2。
  • src 总是 xxxpng 吗?你能把 xxx 和 $style 联系起来吗? (顺便说一句,好聪明的问题)
  • 您对 style 的调用需要调用函数而不是 $choice2,choice2()
  • @TobiasKun 值完全不同,因为有些会给圆形边框小边框等
  • @Cups 不是真的,每个图像的名称都会不同,尽管 ext 可能是 png 或 jpg

标签: php logic


【解决方案1】:

数组呢?在使用下面的代码之前,不要忘记检查$style 是否在正确的范围内。

<?php
$style = $_GET['style'];
$styles = array(
  1=>"display: block;padding:5px; etc, etc etc",
  2=>"display: block;padding:15px; etc, etc etc",
  3=>"display: block;padding:35px; etc, etc etc",
  4=>"display: block;padding:55px; etc, etc etc",
  // etc.
);
?>

<img style="<?php echo $styles[$style]; ?>";  src="xxx.png" />

【讨论】:

  • +1 我还建议你用 CSS 类名替换内联样式
  • +1。使用数组的好方法。切换子句会令人困惑。但也许如果提问者展示更多他的代码,我们可以比这更简化它。
  • @TobiasKun:确实,但他现有的代码甚至没有意义,所以我使用我现有的代码。 :)
  • @Dark Falcon,我喜欢,我非常喜欢,所以我会确保在提交表单时检查此权利(范围),让我试试你的解决方案
  • @DarkFalcon:这不是指控 :) 我只是想了一下,但既然他澄清说 css 属性差异很大,这是最好的答案!
【解决方案2】:

似乎只有填充值在变化,为什么你不尝试这个:

 $style = $_GET['style'];

    <img style="display: block;padding:<?php echo $choice3; ?>px;"  src="xxx.png" />

【讨论】:

  • 由于 css 中没有“etc”属性,我认为他设置了一些其他值。
  • @TobiasKun,是的,在这种情况下,dark 的答案是最好的。
【解决方案3】:

我会改变你的函数来处理所有的边界,而不是有多个这样的东西:

  function border($style){
  switch ($style) {
    case 0:
        $border = "display: block;padding:5px; etc, etc etc";
        break;
    case 1:
        $border = "display: block;padding:5px; etc, etc etc";
        break;
    case 2:
        $border = "display: block;padding:5px; etc, etc etc";
        break;
    default:
        $border = "display: block;padding:5px; etc, etc etc";
   }
   return $border;
  }

【讨论】:

  • 因为有超过 30 个可能的值,所以数组会是更好的方法,就像 @DarkFalcon 建议的那样。
【解决方案4】:

我认为您的代码看起来不错 - 但需要在 var 之前打印/回显。

<img style="<?php print $choice2; ?>" src="..." />

另外,您可以尝试使用 switch 语句。

----- 编辑-----

我会传递一个类名,而不是应用样式。

<img class="<?php print $choice2; ?>" src="..." />

然后,您始终可以在样式表中指定 CSS 而不是内联。

【讨论】:

    【解决方案5】:

    我可以这样设置:

    $myStyles = new Array();
    $myStyles[0] = "display: block;padding:5px; etc, etc etc";
    $myStyles[1] = "display: block;padding:10px; etc, etc etc";
    

    等等……

    function getStyles($style){
          return $myStyles[$style - 1];
    }
    
    <img style="<?php echo getStyles($_GET['style']; ?>";  src="xxx.png" />
    

    未测试...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多