根据字符串键查找数组值


Find array value by string key

我有当前数组:

$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",
);

然后我想检查我的字符串是否包含其中一个键的单词,例如"Covert Rifle"应该匹配数组中的第一个元素并返回"Rifle"。

"My Big Container"应该匹配"Container"并返回"case"。

试图使用

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

不返回任何东西,为FALSE。因为我的键不是数字而是字符串?

你可以这样做:

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值,您可能需要更改返回值

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