我有一个数组,我想在其中搜索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。

我试着做循环,但我想要一个更快的执行代码。


当前回答

还没有人使用过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意味着比较需要为真一次,最终结果将为真。

其他回答

for( $i =0; $i < sizeof($allUsers); $i++)
    {   
    $NEEDLE1='firstname';
    $NEEDLE2='emailAddress';
    $sterm='Tofind';
     if(isset($allUsers[$i][$NEEDLE1]) && isset($allUsers[$i][$NEEDLE2])
        {
            $Fname= $allUsers[$i][$NEEDLE1];
            $Lname= $allUsers[$i][$NEEDLE2];

            $pos1 = stripos($Fname, $sterm);
            $pos2=stripos($Lname, $sterm);//not case sensitive 

            if($pos1 !== false ||$pos2 !== false)
            {$resultsMatched[] =$allUsers[$i];}
            else
            {   continue;}              
        }

}
Print_r($resultsMatched); //will give array for matched values even partially matched

在上述代码的帮助下,可以从2D数组中的任何列中找到任何(部分匹配)数据,因此可以根据需要找到用户id。

扩展@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!而你只想要第一个“纽约”

function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}

这是可行的。你应该这样称呼它:

$id = searchForId('100', $userdb);

重要的是要知道,如果你使用===运算符比较类型必须完全相同,在这个例子中,你必须搜索字符串或使用==代替===。

根据安哥拉人的回答。在PHP的后续版本(>= 5.5.0)中,可以使用一行程序。

$key = array_search('100', array_column($userdb, 'uid'));

这里是文档:http://php.net/manual/en/function.array-column.php。

你可以结合使用两个函数,array_search和array_column。

$search_value = '5465';
$search_key   = 'uid';
$user = array_search($search_value, array_column($userdb, $search_key));

print_r($userdb[$user]);

5465是要搜索的用户ID, uid是包含用户ID的键,$userdb是问题中定义的数组。

引用:

php。net上的Array_search

net上的Array_column

$a = ['x' => ['eee', 'ccc'], 'b' => ['zzz']];

$found = null;
$search = 'eee';

array_walk($a, function ($k, $v) use ($search, &$found) {
    if (in_array($search, $k)) {
        $found = $v;
    }
});

var_dump($found);