2011-12-03 60 views
1

我正在嘗試制定一個php函數來搜索引用頁面的術語,然後根據這些術語的存在性來執行函數。帶多維數組的stripos

創建基本代碼不是一個問題,但有了相當多的單詞和可選操作,對於每組單詞/函數,腳本使用單獨的行變得相當長。基本的代碼概念如下。脫衣舞的功能是相反的優先順序,所以如果出現兩個或更多的術語,那麼最重要的是最後一個,並將超過以前的

(我想有可能有一種方法來退出腳本後第一個條件是滿足的,但我的退出實驗失敗了,所以我只用了反向排序)

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 

有沒有辦法使用二維數組或兩個數組,一個是文字,一個是動作?即:

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查詢,隨後while語句,而不是一個foreach。像一個魅力,感謝Stackoverflow的反饋和各種其他帖子。

感謝所有。

這個地方非常適合學習和理解,文章直接跳到事物的肉,並跳過搜索許多相關但不適用的教程。

+0

退出不退出整個循環和腳本,也許繼續,休息,返回是你在找什麼? – ajreal

+0

我嘗試添加continue;打破;返回;但它仍然遍歷每個foreach() – Tom

回答

0

你可以存儲你的話,行動如在

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

形式的鍵值數組然後再通過這些和使用評估和字符串連接調用的函數:http://php.net/manual/en/function.eval.php

然而,如果你告訴我們更多關於你實際想要達到的目標 - 也就是說你想採取什麼行動的例子,根據什麼詞語? - 可能有更好更清潔的方法來組織你的代碼。並且請記住,Eval需要通過永不傳遞用戶內容來保證安全,因此只能使用您自己的「白名單」命令。

+0

我們的目標是查找位置,然後顯示與該位置相關的特定副本。所以基本上我們會搜索dallas,然後在主頁中包含dallas.inc。基本上基於用於訪問主頁的搜索實現個性化。但是隻會顯示一個位置,因此如果存在多個位置,我們希望按照偏好順序進行搜索,並在找到第一個位置後停止搜索。 – Tom

+0

謝謝,你讓我想到了一條新的大街。我們結束了一個多維數組,因爲我在 – Tom

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,我強烈建議不要這樣做。

+0

以上的編輯感謝。我還沒有想出如何使用eval(至少不是我所知道的)。菲利普的靈感來源於陣列設置。 – Tom