2014-02-21 21 views
2

我正在使用array_search来查找特定值的密钥。
实施例1成功搜索单词绿色阵列,但实施例2试图寻找绿色其中亮绿是阵列中的值,但它不工作。如何搜索一个PHP数组,其中针的数值不完全匹配?

任何人都可以提出一种方法来做到这一点?

//Example 1 
$array = array(0 => 'Green', 1 => 'Blue', 2 => 'Black', 3 => 'Yellow'); 

$key = array_search(strtolower('green'), array_map('strtolower', $array)); 
//displays 0 
echo $key; 

//Example 2 
$array = array(0 => 'Light Green', 1 => 'Blue', 2 => 'Black', 3 => 'Yellow'); 

$key = array_search(strtolower('green'), array_map('strtolower', $array)); 
//should display 0 but displays nothing. 
echo $key; 
+0

这取决于你所期望的。例如,单词'yellowish'匹配'yellow'吗?或者你只想分割包含空格的双字颜色。 – doc

回答

5

使用array_filter()

$array = array(0 => 'Light Green', 1 => 'Blue', 2 => 'Black', 3 => 'Yellow'); 

$search= 'green'; 
$key = key(array_filter($array, function($x) use ($search) 
{ 
    return false!==stripos($x, $search); 
})); 

- 音符,那上面的代码不会检查通过搜索字符串是 “词”。即它3ellow

+0

只需注意,这将接受'黄色'针'黄色'的颜色。 – doc

+0

是的,我已经提到过。 OP没有描述这个限制(如果有的话) –

2

有一个称为fnmatch()美妙几乎没有人知道PHP函数,可能是有用的,它可以让表达式的通配符,可以与array_filter()

$testData = [ 
    'green', 
    'light green', 
    'red', 
    'light Green', 

]; 
$testValue = '*green*'; 

$result = array_filter(
    $testData, 
    function($entry) use ($testValue) { 
     return fnmatch($testValue, strtolower($entry)); 
    } 
); 

var_dump($result); 
+0

唯一的疑问是否会比'preg_match()'/'stripos()'更快。此外,OP需要_key_作为结果 –

+0

要获得密钥(s)作为结果,很简单,将array_keys()作为array_filter()保存为associtivity ....我会让其他人测试它是否更快或比stripos或preg_match()慢......我所做的只是向人们展示函数实际存在并可能在此用例中具有一定价值 –

0

组合可以使用preg_grep()像这样:

$array = array(0 => 'Light Green', 1 => 'Blue', 2 => 'Black', 3 => 'Yellow'); 

$matches = preg_grep('/green/i', $array); 

它返回一个匹配搜索表达式的元素数组;只得到第一个键:

$key = key($matches); 

来匹配一个完整的字,你可以添加单词边界匹配:

$matches = preg_grep('/\bgreen\b/i', $array);