PHPスイッチを使用して、ページのURLのパラメーターで渡される着信キーワードに基づいて特定のファイルを含めています。
たとえば、URLは次のようになります:...page.php?kw=citroen%20berlingo%20keywords
ページ内では、次のようなものを使用したいと思います。
<?
switch($_GET['kw']){
case "berlingo":
include 'berlingo.php'
break;
case "c4":
include 'c4.php';
break;
}
?>
最初のケースで私がやりたいのは、キーワードパラメータcontainsberlingo
の場合にberlingo.php
ファイルを含めることですが、必須ではありませんexactlyそのキーワードのみ。
たとえば、キーワードがberlingo
の場合はberlingo.php
ファイルを含めますが、citroen berlingo
の場合はalsoを含めます。
PHP case select(switchステートメント))を使用して、指定された文字列に値が含まれているかどうかをどのように評価できますか?
ありがとう。
この質問 と この答え に基づいて、私が思いついた解決策(を使用しながら、まだケースを選択)以下にあります。
stristr() または strstr() を使用できます。この場合にstristr()
を使用することを選択した理由は、大文字小文字が区別されないためですinsensitive。したがって、より堅牢です。
例:
$linkKW = $_GET['kw'];
switch (true){
case stristr($linkKW,'berlingo'):
include 'berlingo.php';
break;
case stristr($linkKW,'c4'):
include 'c4.php';
break;
}
また、必要に応じて stripos() または strpos() を使用することもできます(thanks、 Fractaliste )、個人的にこれを読むのはもっと難しいと思います。上記の他の方法と同じ取引。私は大文字小文字の区別があるinsensitiveルートを使いました。
例:
$linkKW = $_GET['kw'];
switch (true){
case stripos($linkKW,'berlingo') !== false:
include 'berlingo.php';
break;
case stripos($linkKW,'c4') !== false:
include 'c4.php';
break;
}
switch
ステートメントでは単純な等値テストのみが実行されるため、ここではあまり役に立ちません。あなたは文字列マッチング関数を通して文字列を実行する必要があります、その最も適切なものはstrpos
です。簡単な答えは次のとおりです。
if (strpos($_GET['kw'], 'berlingo') !== false) {
include 'berlingo.php';
} else if (strpos($_GET['kw'], 'c4') !== false) {
include 'c4.php';
} … and so on …
よりエレガントなソリューションは次のようなものです。
$map = array('berlingo' => 'berlingo.php', 'c4' => 'c4.php', …);
foreach ($map as $keyword => $file) {
if (strpos($_GET['kw'], $keyword) !== false) {
include $file;
break;
}
}
または、キーワードとファイルの対応が常に1:1の場合
$keywords = array('berlingo', 'c4', …);
foreach ($keywords as $keyword) {
if (strpos($_GET['kw'], $keyword) !== false) {
include "$keyword.php";
break;
}
}
strpos 関数は次のように使用できます。
if(strpos($_GET['kw'],'berlingo') !== false) {
include 'berlingo.php';
}
if(strpos($_GET['kw'],'c4') !== false) {
include 'c4.php';
}
$keywords = array('berlingo', 'c4');
foreach($keywords as $keyword)
if(strpos($_GET['kw'], $keyword) !== FALSE)
include("$keyword.php");
ただし、ユーザー入力に基づいてphpファイルを含めることはお勧めしません。
スイッチ->ケースで正規表現を使用することもできます。
<?php
$kw = filter_input(INPUT_GET, "kw");
switch($kw){
case (preg_match('/*berlingo*/', $kw) ? true : false):
include 'berlingo.php';
break;
case "c4":
include 'c4.php';
break;
}
?>
私はこれが事実の後の方法であることを知っていますが、余談ですが、1対1の関係を期待している場合は、ループを完全に回避できます。
以下に沿ったもの:
$map = array('berlingo' => 'berlingo.php', 'c4' => 'c4.php', …);
if( !isset( $map[$_GET['kw']] ))
throw new Exception("Blah!!");
include $map[$_GET['kw']];
...初心者向けの参考情報として共有するだけです。
私の意見では、GET変数を介してスクリプトを含める場合はコードの臭いですが、ロジックを持つメソッドを持つ値クラスを使用してエレガントにこれを行うことができますtrueの場合、値オブジェクト自体を返します。
switch
ステートメントは、$ switch == $ case(緩やかな一致)であるすべてのコードを実行することを覚えておいてください。したがって、_$this
_を返すか、何も返さないメソッドを作成するだけです。
例:
_class Haystack {
public $value;
public function __construct($value)
{
$this->value = $value;
}
public function contains($needle):
{
if (strpos($this->value, $needle) !== false)
return $this;
}
}
$kw = new Haystack($_GET['kw']);
switch ($kw) {
case $kw->contains('berlingo'):
require_once 'berlingo.php';
case $kw->contains('c4'):
require_once 'c4.php';
}
_
もちろん、このコードを寛大にタイプヒントで飾ることができます。使用していて、PHPのバージョンでnull許容の戻り値タイプをサポートしている(つまり、public function contains(string $substring): ?Haystack
のメソッドシグネチャ))を使用していない場合、クラスはそれを反映するように工夫する必要があります。 。
例:
_final class Haystack {
private $value;
private $isMain;
public function __construct(string $value, bool $isMain = true)
{
$this->value = $value;
$this->isMain = $isMain;
}
final public function contains($needle): Haystack
{
if (strpos($this->value, $needle) !== false)
return $this;
return new Haystack($needle, false);
}
}
_
このようにして、明示的なマッチングロジックがメソッド内で失敗した場合、何らかの理由でnew Haystack($_GET['kw']) == new Haystack($needle);
がtrueであれば、非マッチングプロパティ "$ isMain"により、それらが等しいと評価されません。
繰り返しますが、この特定の状況でそもそもなぜこれを実行したいのかを再検討します。従来、 Composer は、PSRオートロード標準を介して必要なさまざまなスクリプトを含めるために使用される依存関係管理ツールです。ルーターライブラリと組み合わせると、実際のニーズに対応するのにおそらく最も役立ちます。