2016-10-22 40 views
3

我已經做了一堆搜索,但無法找出這一個。PHP array_key_exists鍵LIKE字符串,有可能嗎?

我有一個這樣的數組:

我有一個這樣的字符串:

I like cats. 

我想看看如果字符串數組中的任何鍵相匹配。我嘗試以下但顯然它不起作用。

array_key_exists("I like cats", $array) 

假設我可以在給定的時間得到任何隨機字符串,我該怎麼做這樣的事情?

僞代碼:

array_key_exists("I like cats", *.$array.*) 
//The value for cat is "0" 

注意,我要檢查,如果「貓」以任何形式存在。它可以是貓,cathy,甚至像vbncatnm這樣的隨機字母。我從一個MySQL數據庫中獲取數組,我需要知道哪個ID或狗是ID。

+0

_「我想查看字符串是否與數組中的任何鍵相匹配」_您的意思是,如果字符串中的任何**字**與任何鍵匹配? – sidyll

+0

@sidyll是的正確。 –

+0

@KeithC。我編輯了你的問題,添加了你留下的評論和「數據庫」標籤,因爲它可能是相關的。此外,所使用的RDBMS是未知的,因此可以在此發揮作用。如果你覺得數據庫的東西是不相關的,你可以將它回滾到早期版本。 –

回答

4

你可以在鍵上使用正則表達式。所以,如果你的字符串的任何單詞等於這個鍵,$ found就是真的。如果需要,您可以將$ key保存在變量中。 preg_match函數允許測試調節表達式。

$keys = array_keys($array); 
$found = false; 
foreach ($keys as $key) { 
    //If the key is found in your string, set $found to true 
    if (preg_match("/".$key."/", "I like cats")) { 
     $found = true; 
    } 
} 

編輯:

正如評論所說,strpos可能會更好!因此,使用相同的代碼,只需更換的preg_match:

$keys = array_keys($array); 
$found = false; 
foreach ($keys as $key) { 
    //If the key is found in your string, set $found to true 
    if (false !== strpos("I like cats", $key)) { 
     $found = true; 
    } 
} 
+0

謝謝安東尼。當我嘗試這樣做時,我得到「警告:preg_match():分隔符不能是第56行中的/var/app/current/reporting/SqsToDbWorker.php中的字母數字或反斜槓」不知道爲什麼它不能是字母數字? –

+0

我很抱歉,這是我的錯,我解決了這個問題。在preg_match中,我們必須用分隔符圍繞模式($ key,這裏)。我添加了它,但如果你想要的話,你可以使用尖銳的。 – AnthonyB

+0

我認爲正則表達式對於這種事情來說有點過於資源。你可以使用'strpos' –

0

你可以做使用帶有值的preg_match不是數組,但在搜索條件

if(preg_match('~(cat|dog)~', "I like cats")) { 
    echo 'ok'; 
} 

$criteria = '~(cat|dog)~'; 

if (preg_match($criteria, "I like cats")) { 
    echo 'ok'; 
} 

否則,你可以在你的陣列上使用foreach

foreach($array as $key => $value) { 
    $pos = strpos("I like cats", $key); 
    if ($pos > 0) { 
     echo $key . ' '. $value; 
    } 

} 
+0

瞭解。但是,我從數據庫中獲取數組,並且需要知道哪個ID車或狗是。 –

0

這會幫助你實現你想要做什麼:

$array   = array('cat' => 10, 'dog' => 1); 

$findThis  = 'I like cats'; 

$filteredArray = array_filter($array, function($key) use($string){ 

    return strpos($string, $key) !== false; 

}, ARRAY_FILTER_USE_KEY); 

我發現使用array_filter功能與閉合/匿名函數比foreach循環更優雅,因爲它保持了一個縮進級別。

+0

我會給它一個鏡頭,因爲它看起來很乾淨。 –