2011-12-03 21 views
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つの配列を使用する方法がありますか?単語とアクションの2つの配列がありますか?すなわち:UPDATED

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']; } } 

...... UPDATED ......

それはwhile文ではなく、foreachのに続いて、簡単なMySQLのクエリに進化してきました。 Stackoverflowのフィードバックやさまざまな投稿のおかげで、魅力のように機能します。

ありがとうございます。

この場所は学習や理解に最適です。投稿は物事に直接飛びつき、関連するが適用外のチュートリアルを多数検索する必要はありません。

+0

exitがループとスクリプト全体を終了していない可能性があります。 – ajreal

+0

私は続行を追加しようとしました。ブレーク;戻る;それでもforeach()を実行します。 – Tom

答えて

0

あなたは

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

の形で、キーと値の配列としてあなたの言葉-アクションは、これらを通過し、機能を呼び出すために評価および文字列連結を使用して格納することができ:http://php.net/manual/en/function.eval.php

しかし、あなたが実際に達成したいこと、つまり言葉に基づいて、あなたが取る行動の例は何ですか? - あなたのコードを整理するための方がはるかに優れているかもしれません。また、Evalはユーザーのコンテンツを決して通過させないことで保護される必要があることを忘れないでください。そうすれば、自分の「ホワイトリストに登録」されたコマンドでしか動作しません。

+0

私たちの目標は、場所を探して、その場所に関連する特定のコピーを表示することです。だから、基本的にはダラスを検索し、dallas.incをホームページに入れます。ホームページに到達するために使用された検索に基づいて本質的にパーソナライズします。しかし、1つの場所だけが表示されるので、複数の場所がある場合、優先順位の高い順に検索し、最初のものが見つかると検索を停止することが理想的です。 – Tom

+0

ありがとう、あなたは私に新しい道を考えさせました。私は上の編集で多次元配列に終わった – Tom

0

フィリップ・レンズセンから与えられた答えは間違いなく正解であり、うまくいくはずですが、私は実際に関数を実行するために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を使用する必要はありません。私は強く反対します。

+0

ありがとう。私はevalを使用する方法を理解していません。フィリップのインスピレーションは、アレイの設定にもっとありました。 – Tom