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

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


当前回答

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。

其他回答

你可以结合使用两个函数,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

试试这个

<?php
 function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && 
            recursive_array_search($needle,$value) !== false)) {
             return $current_key;
        }
    }
    return false;
 }
 ?>

我正在寻找类似于MySQL像%term%的功能。根据本页的答案。我能够从文件中搜索JSON数组。

user_list。Json看起来像下面的示例:

{
  "user-23456": {
        "name": "John Doe",
        "age": "20",
        "email": "doe@sample.com",
        "user_id": "23456"
    },
    "user-09876": {
        "name": "Ronojoy Adams",
        "age": "35",
        "email": "joy@sample.com",
        "user_id": "09876"
    },
    "user-34890": {
        "name": "Will Artkin",
        "age": "16",
        "email": "will@sample.com",
        "user_id": "34890"
    },
}

/*
*search_key_like
*/

function search_key_like($value, $key, $array) {
     $results=array();
    $keyword = preg_quote($value, '~');
   foreach ($array as $k => $val) {
//if name a is spell John and keyword is sent as joh or JOH it will return null
//to fix the issue convert the string into lowercase and uppercase
       $data=array($val[$key],strtolower($val[$key]),strtoupper($val[$key]));
       if (preg_grep('~' . $keyword . '~', $data)) {
       array_push($results,$val[$key]);           
    }
   }
   return $results;
}

使用===提取JSON文件===

 $user_list_json='./user_list.json';
    if(file_exists($user_list_json) && file_get_contents($user_list_json)){
    $file_json_data=file_get_contents($user_list_json);
        
    $json_array_data=json_decode($file_json_data,true);
        
        $user_name_like = search_key_like('ron', 'name', $json_array_data);
   
         print "<pre>".print_r($user_name_like,true);
    }

在Jakub的出色回答的基础上,这里有一个更通用的搜索,将允许指定键(不仅仅是uid):

function searcharray($value, $key, $array) {
   foreach ($array as $k => $val) {
       if ($val[$key] == $value) {
           return $k;
       }
   }
   return null;
}

用法:$results = searcharray('searchvalue', searchkey, $array);

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