【问题标题】:PHP - String Concatenation - By loopPHP - 字符串连接 - 通过循环
【发布时间】:2014-05-06 09:35:07
【问题描述】:

这是我的代码,

if ($_SESSION["crossfit"]=="Y") { if ($_SESSION["tr_duration1"]==1) { $dr1="1 Month"; } else {
if ($_SESSION["tr_duration1"]==12) { $dr1="1 Year"; } else
   { $dr1=$_SESSION["tr_duration1"] . ' Months'; }} $c1='Crossfit - ' . $dr1;}

if ($_SESSION["muaythai"]=="Y") { if ($_SESSION["tr_duration2"]==1) { $dr2="1 Month"; } else {
if ($_SESSION["tr_duration2"]==12) { $dr2="1 Year"; } else
   { $dr2=$_SESSION["tr_duration2"] . ' Months'; }} $c2=', Muaythai - ' . $dr2;}

if ($_SESSION["mma"]=="Y") { if ($_SESSION["tr_duration3"]==1) { $dr3="1 Month"; } else {
if ($_SESSION["tr_duration1"]==12) { $dr3="1 Year"; } else
   { $dr3=$_SESSION["tr_duration3"] . ' Months'; }} $c3=', MMA - ' . $dr3;}

if ($_SESSION["gymnastics"]=="Y") { if ($_SESSION["tr_duration4"]==1) { $dr4="1 Month"; } else {
if ($_SESSION["tr_duration4"]==12) { $dr4="1 Year"; } else
   { $dr4=$_SESSION["tr_duration4"] . ' Months'; }} $c4=', Gymnastics - ' . $dr4;}

$for = $c1 . $c2 . $c3 . $c4 . '.';

至少有一个程序是“Y”或所有程序。

我想要的是 $c1 $c2 $c3 $c4 以 ',' 分隔并以 '.' 结尾。所以它变得可读。

我的问题是如果我放

$for = $c1 . $c2 . $c3 . $c4 . '.'; 和 ',' 与 $c1 并选择程序 2 和 3

我明白了

$for = , Muaythai - 3 Months, MMA - 12 Months.

我当然想要,

$for = Muaythai - 3 Months, MMA - 12 Months.

如果我直接在 $for 中输入 ',',如果选择了第 2 和第 3 个程序,则从 $c1 中删除

$for = $c1 . ',' . $c2 . ',' . $c3 . ',' . $c4 . '.'

我明白了

$for = ,Muaythai - 3 Months, MMA - 12 Months,.

我想要

$for = Muaythai - 3 Months, MMA - 12 Months.

我也尝试过嵌套这么多的 isset,但没有成功。 我也尝试过创建一个“for”循环,但最终出现的语法错误多于输出错误

只有当我只选择第一个程序或所有 4 个程序时它才能正常工作。

【问题讨论】:

  • 使用单个字符串并将所有值连接到它。

标签: php string loops string-concatenation


【解决方案1】:

试试这样的:

$tmp = array($c1,$c2,$c3,$c4);
$filtered = array_filter($tmp);
$for = implode(",", $filtered).".";

这将删除所有未填充的$c_ 变量,并用逗号分隔它们。


编辑:我已经重新审视了您的代码,并想推荐这个优化版本:

$keys = array("Crossfit","Muaythai","MMA","Gymnastics");
$result = array();
foreach($keys as $i=>$name) {
    if( $_SESSION[strtolower($name)] == "Y") {
        $duration = $_SESSION['tr_duration'.($i+1)];
        switch($duration) {
            case 1:  $dur = "1 Month"; break;
            case 12: $dur = "1 Year";  break;
            default: $dur = $duration." Months";
        }
        $result[] = $name." - ".$dur;
    }
}
if( !$result) $for = "Nothing selected!";
else $for = implode(", ",$result).".";

如果您需要帮助了解这里发生了什么,请随时提问!

【讨论】:

  • 太棒了..但是我不明白你做了什么,因为我是 PHP 新手,所以我会去阅读文档。非常感谢。
  • 没问题 :) php.net/array-filter 应该有帮助。基本上,通过不传递回调函数,它只是检查它们是否真实。 php.net/implode 非常宝贵。
  • @huz_akh:第一条语句将所有变量$c1$c4 存储到一个名为$tmp 的数组中。 array_filter() 函数然后删除空值。 implode() 将数组中的片段连接到一个以逗号分隔的字符串。
  • @huz_akh 我已经编辑了我的答案以包含您的代码的审查版本。看看吧!
  • @NiettheDarkAbsol 感谢您的代码,我在我的程序中多次使用它。它帮助我将整个程序代码从 1500 行精简到 600 行..
【解决方案2】:

您可以使用单个变量并将值连接到它。

试试这样:

for = "";
if ($_SESSION["crossfit"] == "Y") {
    if ($_SESSION["tr_duration1"] == 1) {
        $dr1 = "1 Month";
    } else {
        if ($_SESSION["tr_duration1"] == 12) {
            $dr1 = "1 Year";
        } else {
            $dr1 = $_SESSION["tr_duration1"] . ' Months';
        }
    }
    $for .= 'Crossfit - ' . $dr1;
}

if ($_SESSION["muaythai"] == "Y") {
    if ($_SESSION["tr_duration2"] == 1) {
        $dr2 = "1 Month";
    } else {
        if ($_SESSION["tr_duration2"] == 12) {
            $dr2 = "1 Year";
        } else {
            $dr2 = $_SESSION["tr_duration2"] . ' Months';
        }
    }
    $for .= empty($for) ? 'Muaythai - ' . $dr2 : ', Muaythai - ' . $dr2;
}

if ($_SESSION["mma"] == "Y") {
    if ($_SESSION["tr_duration3"] == 1) {
        $dr3 = "1 Month";
    } else {
        if ($_SESSION["tr_duration1"] == 12) {
            $dr3 = "1 Year";
        } else {
            $dr3 = $_SESSION["tr_duration3"] . ' Months';
        }
    }
    $for .= empty($for) ? 'MMA - ' . $dr3 : ', MMA - ' . $dr3;
}

if ($_SESSION["gymnastics"] == "Y") {
    if ($_SESSION["tr_duration4"] == 1) {
        $dr4 = "1 Month";
    } else {
        if ($_SESSION["tr_duration4"] == 12) {
            $dr4 = "1 Year";
        } else {
            $dr4 = $_SESSION["tr_duration4"] . ' Months';
        }
    }
    $for .= empty($for) ? 'Gymnastics - ' . $dr4 : ', Gymnastics - ' . $dr4;
    $c4 = ', Gymnastics - ' . $dr4;
}

你应该使用 switch case 而不是许多 if else。

【讨论】:

  • 我尝试过类似的方法,除了 'empty($for) ?'事情..也许这就是我的代码失败的原因。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 2017-12-18
  • 2013-11-23
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
相关资源
最近更新 更多