2016-11-10 77 views
0

我当前的阵列查找数组值:通过字符串键

$types = array(
    "Rifle" => "rifle", 
    "SMG" => "smg", 
    "Knife" => "knife", 
    "Sticker" => "sticker", 
    "Container" => "case", 
    "Key" => "key", 
    "Shotgun" => "heavy", 
    "Machinegun" => "heavy", 
    "Music Kit" => "music", 
    "Graffiti" => "graffiti", 
    "Tag" => "tag", 
); 

那么我想,要检查我的字符串包含的关键之一字,例如“秘密步枪”应该匹配数组中的第一个元素并返回“步枪”。

“我的大容器”应匹配“容器”并返回“案例”。

尝试使用

array_search("My Big Container", $types); 

这不返回任何东西,是假。我拿它,因为我的钥匙不是数字,而是字符串?

回答

1

你可以这样做:

function getArrayValueBasedOnString($array, $string, $caseSensitive = false){ 
    $s = $caseSensitive ? '' : 'i'; 
    foreach($array as $k => $v){ 
    if(preg_match('/'.preg_quote($k, '/')."/$s", $string)){ 
     return $v; 
    } 
    } 
    return null; 
} 
$result = getArrayValueBasedOnString($types, 'My Big Container'); 

当然,这将返回第一场比赛。如果您有任何null$array值,您可能需要更改该返回值。

+1

你应该考虑preg_quote转义正则表达式的保留值。 – Simon

+0

当然,我同意,如果你有任何奇怪的数组键。 – PHPglue

1

array_search正在搜索值。 如果你要搜索的钥匙,你应该使用array_keys

$key = array_search("Container", array_keys($types)); 
if(is_array($key) && count($key) > 0) 
    return $types[$key]; 

然而,array_search将执行精确匹配变换键的值。如果你想部分匹配(一个字)或不区分大小写,否则,那么你不应该使用array_search但在所有键循环,并试图找到任何文字

$keys = array_keys($types); 
$words = explode(" ", "My Big Container"); 
$match = null; 
foreach($keys as $k) 
    foreach($words as $w) 
     if($k == $w) $match = $w; 

if($match !== null) 
    return $types[$match]; 
+0

这绝对是一个多字搜索(并可能区分大小写)。我有什么替代方法可以用于array_search? – user1372896

+0

我包括一个(简单)多词搜索的例子 – Simon