32

ページの URL のパラメーターで渡された着信キーワードに基づいて特定のファイルを含めるために、PHP スイッチを使用しています。

たとえば、URL は次のようになります。...page.php?kw=citroen%20berlingo%20keywords

ページ内では、次のようなものを使用したいと思います。

<?
    switch($_GET['kw']){

        case "berlingo":     
            include 'berlingo.php'
            break;
        case "c4":
            include 'c4.php';
            break;

    } 
?>

最初のケースでやりたいことは、キーワード パラメータに が含まれてberlingo.phpいる場合にファイルをインクルードすることですが、そのキーワードだけである必要はありません。 berlingo

たとえばberlingo.php、キーワードが の場合にファイルをインクルードしたいのですberlingo、それが.citroen berlingo

PHP の case select (switch ステートメント) を使用して、特定の文字列に値が含まれているかどうかを評価するにはどうすればよいですか?

ありがとう。

4

8 に答える 8

8

ステートメントで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;
    }
}
于 2010-11-14T02:46:03.487 に答える
1
$keywords = array('berlingo', 'c4');
foreach($keywords as $keyword)
  if(strpos($_GET['kw'], $keyword) !== FALSE)
    include("$keyword.php");

ただし、ユーザー入力に基づいてphpファイルを含めることはお勧めしません。

于 2010-11-14T02:49:20.353 に答える
1

strpos関数を次のように使用できます。

if(strpos($_GET['kw'],'berlingo') !== false) {
 include 'berlingo.php';
}
if(strpos($_GET['kw'],'c4') !== false) {
 include 'c4.php';
}
于 2010-11-14T02:43:27.990 に答える
0

strpos()文字列に別の文字列が含まれているかどうかを確認するためのものです。

文字列などの類似性をチェックするための他の関数があります。

ただし、静的な式を単一の値と比較するため、 Aswitchは役に立ちません。sを使用する必要がありますif

于 2010-11-14T02:41:18.217 に答える
0

私の意見では、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';
}

もちろん、このコードにタイプヒントを惜しみなく飾ることもできます。使用していて、null 許容の戻り値の型 (つまり のメソッド シグネチャ) をサポートするバージョンの PHP を使用していない場合は、それ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 自動ロード標準を介して必要なさまざまなスクリプトを含めるために使用されます。Router ライブラリと組み合わせると、実際のニーズに対応するのにおそらく最も役立つでしょう。

于 2019-03-18T20:39:50.003 に答える