奇怪的PHP字符串比较效果,这可以做得更好吗


Strange PHP string compare effect, could this be made nicer?

我更新了一个网站,在我的页面中发现了一个烦人的问题我解决了它,但我真的不相信它应该是这样的。对我来说,我不是PHP专家——有人能解释我的奇怪行为吗?

我有这个代码:

if($Menu == "index"){
   {if ($Language == "UK"){echo "<td><h1>Welcome</h1>";}
   {if ($Language == "NL"){echo "<td><h1>Welkom </h1>";}
   }
  else
   // if $menu was not index it displayed a hyperlink to Welcome page

这里的字符串在检查语言时工作得很好。$Menu的比较不起作用,即使它包含单词索引由于整个页面都是动态生成的,一些字符串操作在之前完成我认为也许吧,尽管我也用测试过

   echo "dump Menu variable " . $Menu

这导致jut在页面上显示单词索引。所以字符串类型或类似的东西可能会出错

所以我试验了

  if($Menu === "index") 

运气不佳

好吧,我终于像这个一样解决了它

  if (strpos($Menu,'index' !==false)

真的应该这样做吗???,我觉得不太舒服。对我来说,奇怪的是,对于$Language来说,它只是正常工作(在我看来)。这里是否存在某种类型问题,或者可能是不需要的结尾''n我是否可以规范化字符串以进行可读字符串比较的内容,或者使用不同类型的相等运算符。在我看来,$Menu可以更容易地处理。也许是重新格式化,但我在这里不确定。

看起来您的索引字符串确实包含空格,而不是strpos,您可以使用trim( $Menu )来消除它们。

但最好的办法是防止它们的发生。您可以尝试使用echo "dump Menu variable |" . $Menu ."|";或仅使用var_dump( $Menu )来识别其他字符。

也许你可以张贴,你的代码段$Menu是填写。

(抱歉,不能只是评论)

您可以尝试类似的

$Menu = trim($Menu);
$Language = trim($Language);
$langAllowed = ["UK", "NL"]; // zero element is default;
if(!in_array($Language, $langAllowed )) $Language = $langAllowed[0];
$menuLocales=[
    "index" => [
        "UK"=>"Welcome",
        "NL"=>"Welkom "
    ],
    "default"=>[
        "UK"=>"Welcome default (no index)",
        "NL"=>"Welkom default (no index)"
    ]
];
$MenuIndex = isset($menuLocales[ $Menu ]) ? $Menu : "default";
echo "<td><h1>".$menuLocales[ $MenuIndex ][ $Language  ]."</h1>";