我有一个数组,我想在其中搜索uid并获得数组的键。
例子
假设我们有以下二维数组:
$userdb = array(
array(
'uid' => '100',
'name' => 'Sandra Shush',
'pic_square' => 'urlof100'
),
array(
'uid' => '5465',
'name' => 'Stefanie Mcmohn',
'pic_square' => 'urlof100'
),
array(
'uid' => '40489',
'name' => 'Michael',
'pic_square' => 'urlof40489'
)
);
函数调用search_by_uid(100)(第一个用户的uid)应该返回0。
函数调用search_by_uid(40489)应该返回2。
我试着做循环,但我想要一个更快的执行代码。
扩展@mayhem创建的函数,这个例子将更多的是一个“模糊”搜索,如果你只是想匹配搜索字符串的一部分(大部分):
function searchArrayKeyVal($sKey, $id, $array) {
foreach ($array as $key => $val) {
if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) {
return $key;
}
}
return false;
}
例如,数组中的值是Welcome to New York!而你只想要第一个“纽约”
还没有人使用过array_reduce,所以我想添加这个方法…
$find_by_uid = '100';
$is_in_array = array_reduce($userdb, function($carry, $user) use ($find_by_uid){
return $carry ? $carry : $user['uid'] === $find_by_uid;
});
// Returns true
与array_search()相比,可以更好地控制'search'逻辑。
注意,我在这里使用了严格的等式,但您可以选择不同的比较逻辑。$carry意味着比较需要为真一次,最终结果将为真。
如果你使用的是(PHP 5 >= 5.5.0),你不需要自己写函数来实现这个功能,只需要写这一行就可以了。
如果你只想要一个结果:
$key = array_search(40489, array_column($userdb, 'uid'));
对于多个结果
$keys = array_keys(array_column($userdb, 'uid'), 40489);
如果你有一个关联数组,就像注释中指出的那样,你可以用:
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);
如果你使用的是PHP < 5.5.0,你可以使用这个backport,谢谢ramsey!
更新:我一直在做一些简单的基准测试,多重结果表单似乎是最快的,甚至比Jakub自定义函数还要快!