1

参照ページで用語を検索し、それらの用語の存在に基づいて関数を実行するphp関数を作成しようとしています。

基本的なコードの作成は問題ではありませんでしたが、かなりの数の単語とオプションのアクションがあるため、単語/機能のグループごとに個別の行を使用してスクリプトが非常に長くなります。基本的なコードの概念は次のとおりです。ストライプ関数は優先順位が逆になっているため、2つ以上の用語が表示された場合、最も重要な用語が最後になり、前の用語よりも優先されます。

(最初の条件が満たされた後にスクリプトを終了する方法があると思いますが、終了の実験が失敗したため、逆シーケンスを使用しました)

group1 = array("word1","word2","word3","word4","word5");
group2 = array("word6","word7","word8");
group3 ... etc

foreach($group1 as $groupa) { if(stripos($string, $groupa) !== false) { do something A; }  }
foreach($group2 as $groupb) { if(stripos($string, $groupb) !== false) { do something B; }  }
foreach ... etc

2次元配列または2つの配列を使用する方法はありますか?1つは単語を使用し、もう1つはアクションを使用しますか?すなわち:

words = array("word1","word2","word3","word4","word5","word6","word7","word8")
actions = array("something A","something A","something A","something A","something A","something B","something B","something B")

foreach($words as $word) { if(stripos($string, $word) !== false) { do actions; }  }

...... 更新しました ......

フィリップスの提案に触発されて、私たちは多次元配列に行き着き、次にその「行」をステップスルーしました。現在、コードで配列を書き出すのではなく、MySQLから配列をフェッチする作業を行っています。

$terms = array( 
array( "word" => "word1", 
      "cat" => "dstn",
      "value" => "XXXX" 
    ),
    ..etc
    ..etc
);
foreach ($terms as $i => $row)  
{ if(stripos($refstring3, $row['word']) !== false) { $$row['cat'] = $row['value']; }  }

...... 更新しました ......

単純なMySQLクエリに進化し、その後にforeachではなくwhileステートメントが続きます。Stackoverflowに関するフィードバックやその他のさまざまな投稿のおかげで、魅力のように機能します。

ありがとうございます。

この場所は学習と理解に最適です。投稿は物事の本質に直接ジャンプし、関連しているが適用できない多数のチュートリアルを検索する必要はありません。

4

2 に答える 2

0

ワードアクションを次の形式のKey-Value配列として格納できます。

$actionsForWord = array("myAction" => "myword", "myAction2" => "myword2");

次に、これらを確認し、Evalと文字列の連結を使用して関数を呼び出します:http://php.net/manual/en/function.eval.php

しかし、実際に達成したいこと、つまり、どのような言葉に基づいて実行したい行動の例をいくつか教えてください。-コードを整理するためのより良い、よりクリーンな方法があるかもしれません。また、Evalはユーザーコンテンツを渡さないことで保護する必要があるため、独自の「ホワイトリストに登録された」コマンドでのみ機能することに注意してください。

于 2011-12-03T12:06:06.533 に答える
0

Philipp Lenssenが出した答えは確かに正しく(そして受け入れられ)、機能しますが、関数を実行するためにevalを使用するという考えは本当に嫌いです。代わりにこれを試すことができます。

<?php
function search( $content, $actions ) {
    foreach( $actions as $action => $terms ) {
        foreach( $terms as $term ) {
            if( stripos( $content, $term ) !== false ) {
                /* Match found, perform $action, and return. */
                return $action( strtolower( $term ) );
            }
        }
    }
    return false;
}

function foo( $term ) {
    return "foo(): Found the term '{$term}'.";
}

function bar( $term ) {
    return "bar(): Found the term '{$term}'.";
}


$tests = array(
    'This is text containing term 1' => "foo(): Found the term 'term 1'.",
    'term 2 is in this text' => "foo(): Found the term 'term 2'.",
    'Capitals work, TERM 3' => "bar(): Found the term 'term 3'.",
    'No correct term to be found here' => false
);

$actions = array(
    'foo' => array(
        'term 1',
        'term 2'
    ),
    'bar' => array(
        'term 3'
    )
);

foreach( $tests as $content => $expected ) {
    $result = search( $content, $actions );
    echo $result . ( $result === $expected ? ' (CORRECT)' : ' (FALSE)' ) . PHP_EOL;
}

本当にevalを使用する必要はないので、強くお勧めします。

于 2011-12-05T13:24:35.097 に答える