按字符串键查找数组值

时间:2016-11-10 00:04:15

标签: php arrays

我有当前的数组:

$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”。

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

尝试使用

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

这不会返回任何内容并且为FALSE。我接受它是因为我的键不是数字而是字符串?

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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值,则可能需要更改该返回值。