471

I have an array where I want to search the uid and get the key of the array.

Examples

Assume we have the following 2-dimensional array:

$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'
    )
);

The function call search_by_uid(100) (uid of first user) should return 0.

The function call search_by_uid(40489) should return 2.

I tried making loops, but I want a faster executing code.

Rahul
  • 18,271
  • 7
  • 41
  • 60
Rachit
  • 4,749
  • 3
  • 16
  • 7
  • interestingly the underscore (and lowdash) librarires add this function to javascript... – ErichBSchulz Mar 07 '14 at 12:37
  • 12
    I wrote a script to test the performance of a few of the answers. It generates a 500k-member array of arrays and searches through it for a value in the last member. I compared a function like the accepted answer, to the two `array_column` one-liner answers. I modified them all to return the actual discovered array, not just the key, because usually that's my use case. The function method scored 0.361, search-col 0.184 and keys-col 0.189 average micro delay over 1000 runs for each method. – Josh Feb 14 '16 at 12:49

23 Answers23

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

This will work. You should call it like this:

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

It is important to know that if you are using === operator compared types have to be exactly same, in this example you have to search string or just use == instead ===.

Based on angoru answer. In later versions of PHP (>= 5.5.0) you can use one-liner.

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

Here is documentation: http://php.net/manual/en/function.array-column.php.

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
Jakub Truneček
  • 8,800
  • 3
  • 20
  • 35
  • 17
    You should also be able to do this without PHP 5.5 in a one liner using array_map in place of array_column. Just replace `array_column($userdb, 'uid')` with `array_map(function($v){return $v['uid'];},$userdb)` – Jesse Green Feb 23 '16 at 18:12
  • 2
    Yea, you are right. Lambda functions are available since PHP 5.3. and better is `array_search`, isn't it? – Jakub Truneček Feb 25 '16 at 12:43
  • 4
    @angoru I think the original solution (the `foreach` loop) will perform faster because it stops as soon as a match is found. The newer solution has to iterate through the whole array once to extract `array_column`, then loop through it a second time to perform the search (until it finds a match). The newer solution is easier to read, more concise, but the OP specifically brought up performance as an issue – BeetleJuice Jul 27 '17 at 17:19
  • @JakubTruneček . I have something to do with the same array given in the question. I want user's name from the array by passing id. Function findUserName(40489) should return 'Michael'. How its possible? – Ashok Gujjar Aug 31 '18 at 06:40
  • @JakubTruneček Hi i have faced this problem in my code but i have quite different thing. In my case 'uid' value present multiple times so i need to get an arrays of founded key. – Bhavin Thummar Sep 25 '18 at 11:54
  • Thanks @JakubTruneček. Your solution is working for matching string too so i like your solution. – Bhavin Thummar Sep 25 '18 at 12:38
  • if suppose I want to search a combination of uid = 100 AND name = Sandra Shush. What can i do @Jakub Truneček – Balakumar B Feb 22 '19 at 07:08
  • 7
    Keep in mind that the one-liner answer wont work if your array keys are not _0, 1, 2, 3, n_ (numerical and in order starting with zero), because using `array_column` will reset the keys. – dearsina Mar 03 '19 at 13:25
  • @BalakumarB. Just add `$val['uid'] === $id && $val'name'] == 'Sandra Shush'`. dont forget to pass `$name` parameter in function – Sudharshan Nair Mar 12 '19 at 07:29
  • The solution $key = array_search('100', array_column($userdb, 'uid')); only works as long as the keys are 0,1,2,3 and properly ordered. If the array has keys like 'a','b','c' and you want to get the corresponding key, it will not work. – thesailorbreton Sep 19 '19 at 09:37
  • `$key = array_search('100', array_column($userdb, 'uid'));` just love it! – Anupam Jun 05 '21 at 10:32
469

If you are using (PHP 5 >= 5.5.0) you don't have to write your own function to do this, just write this line and it's done.

If you want just one result:

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

For multiple results

$keys = array_keys(array_column($userdb, 'uid'), 40489);

In case you have an associative array as pointed in the comments you could make it with:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);

If you are using PHP < 5.5.0, you can use this backport, thanks ramsey!

Update: I've been making some simple benchmarks and the multiple results form seems to be the fastest one, even faster than the Jakub custom function!

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
angoru
  • 5,859
  • 1
  • 16
  • 20
  • what if the value I am searching(in this example is 40489) appears more that one time and I want to get all the keys that it appears? – Dimitris Papageorgiou May 15 '15 at 09:13
  • if the value 40489 appears more then once in the array will the function return an array of keys ... ?? @angoru – jishan May 19 '15 at 08:23
  • If you use the second case for multiple results, you get an array of keys. – angoru May 19 '15 at 08:44
  • 3
    This did not work for me when the key in the $userdb did not start as 0,1, 2 etc.. and say the key are 1234,4566 etc. The resulting keys after the array_search are always 0,1,2 and so on – Kaushtuv Apr 11 '16 at 06:41
  • 4
    This won't work with an associative array, however you can get around that like so: `array_search(40489, array_combine(array_keys($userdb), array_column($userdb, 'uid')))` – John Mellor Jun 02 '17 at 05:53
  • Why does this not also follow for PHP7? – TarangP Jan 05 '18 at 13:19
  • @TarangP I've tested on PHP7.022 and it worked for me, can you tell me wich one fails? – angoru Jan 08 '18 at 14:20
  • Nah..! its not failing. but just asking. thanks @angoru – TarangP Jan 09 '18 at 05:25
  • thanks @angoru I have really solved my problem using your method second one to check for multiple keys using this code `$keys = array_keys(array_column($userdb, 'uid'), 40489);` – Bhavin Thummar Sep 25 '18 at 11:59
  • hii @angoru I have one problem this is only working for one word but this not working for string compare. This is always match with one word so this thing is wrong in my scenario. – Bhavin Thummar Sep 25 '18 at 12:34
  • don't forgot check return key with `===` operator. – Nabi K.A.Z. Jun 02 '19 at 03:05
  • This will fail in a conditional if the array search returns a match where the index is 0 FYI – ganicus Sep 04 '19 at 22:58
  • 1
    Note: If no case is found, the first statement returns `false` and the next two statements return an empty array `[]`. – Nabi K.A.Z. Jan 24 '20 at 20:06
  • $key result is useless in case when column has null values. Array_column result will have less elements than original array, so $key won't point to actual key for corresponding element in original array – tijs Jan 18 '21 at 20:01
  • @tijs If some of the 'uid' are NULL the script works the same. array_column will return an array with empty values for every null 'uid' but will keep the structure. – angoru Jan 20 '21 at 09:34
59

In later versions of PHP (>= 5.5.0) you can use this one-liner:

$key = array_search('100', array_column($userdb, 'uid'));
Stephen Kennedy
  • 20,585
  • 22
  • 95
  • 108
Iryna Batvina
  • 1,656
  • 13
  • 7
  • 7
    Just put array_column result in a specific variable avoiding array_column be called for each result on the array. – Maykonn Oct 08 '19 at 21:07
34

Looks array_filter will be suitable solution for this...

$userdb=Array
(
    (0) => Array
        (
            (uid) => '100',
            (name) => 'Sandra Shush',
            (url) => 'urlof100'
        ),

    (1) => Array
        (
            (uid) => '5465',
            (name) => 'Stefanie Mcmohn',
            (pic_square) => 'urlof100'
        ),

    (2) => Array
        (
            (uid) => '40489',
            (name) => 'Michael',
            (pic_square) => 'urlof40489'
        )
);

PHP Code

<?php 
$search = 5465;
$found = array_filter($userdb,function($v,$k) use ($search){
  return $v['uid'] == $search;
},ARRAY_FILTER_USE_BOTH); // With latest PHP third parameter is optional.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY  

$values= print_r(array_values($found));
$keys =  print_r(array_keys($found)); 
Csharls
  • 550
  • 8
  • 19
BEJGAM SHIVA PRASAD
  • 2,181
  • 1
  • 18
  • 27
  • shows an error :`syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ';'` – Shihas Apr 11 '18 at 11:21
  • Can you please paste more info I mean which line and your code and array structure. – BEJGAM SHIVA PRASAD Apr 12 '18 at 04:01
  • @Shihas I updated answer, I am sure it will be resolved. – BEJGAM SHIVA PRASAD Aug 07 '19 at 04:10
  • 1
    I think this is the proper solution to return the entire resulting array preserving the key. A shorter approach with PHP >= 7: `array_filter($userdb, fn ($v) => $v['uid'] == $search)`. You don't even need to pass the var to the callback. Check https://www.php.net/manual/es/functions.arrow.php – Luciano Fantuzzi Aug 14 '22 at 22:05
33

Building off Jakub's excellent answer, here is a more generalized search that will allow the key to specified (not just for uid):

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

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

Community
  • 1
  • 1
reflexiv
  • 1,693
  • 1
  • 21
  • 24
22

I know this was already answered, but I used this and extended it a little more in my code so that you didn't have search by only the uid. I just want to share it for anyone else who may need that functionality.

Here's my example and please bare in mind this is my first answer. I took out the param array because I only needed to search one specific array, but you could easily add it in. I wanted to essentially search by more than just the uid.

Also, in my situation there may be multiple keys to return as a result of searching by other fields that may not be unique.

 /**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }

Later, I ended up writing this to allow me to search for another value and associative key. So my first example allows you to search for a value in any specific associative key, and return all the matches.

This second example shows you where a value ('Taylor') is found in a certain associative key (first_name) AND another value (true) is found in another associative key (employed), and returns all matches (Keys where people with first name 'Taylor' AND are employed).

/**
 * @param array multidimensional 
 * @param string $search_value The value to search for, ie a specific 'Taylor'
 * @param string $key_to_search The associative key to find it in, ie first_name
 * @param string $other_matching_key The associative key to find in the matches for employed
 * @param string $other_matching_value The value to find in that matching associative key, ie true
 * 
 * @return array keys, ie all the people with the first name 'Taylor' that are employed.
 */
 function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) {
    // This function will search the revisions for a certain value
    // related to the associative key you are looking for.
    $keys = array();
    foreach ($dataArray as $key => $cur_value) {
        if ($cur_value[$key_to_search] == $search_value) {
            if (isset($other_matching_key) && isset($other_matching_value)) {
                if ($cur_value[$other_matching_key] == $other_matching_value) {
                    $keys[] = $key;
                }
            } else {
                // I must keep in mind that some searches may have multiple
                // matches and others would not, so leave it open with no continues.
                $keys[] = $key;
            }
        }
    }
    return $keys;
}

Use of function

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);

Result

Array ( [0] => 2 ) 
Nadeem0035
  • 3,757
  • 1
  • 24
  • 36
amurrell
  • 2,383
  • 22
  • 26
14

You can do that with combination of two functions, 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 is the user ID you want to search, uid is the key that contains user ID and $userdb is the array that is defined in the question.

References:

array_search on php.net

array_column on php.net

Usman Ahmed
  • 2,392
  • 1
  • 20
  • 17
10

I modified one of examples below description function array_search. Function searchItemsByKey return all value(s) by $key from multidimensional array ( N levels). Perhaps , it would be useful for somebody. Example:

 $arr = array(
     'XXX'=>array(
               'YYY'=> array(
                    'AAA'=> array(
                          'keyN' =>'value1'
                   )
               ),
              'ZZZ'=> array(
                    'BBB'=> array(
                          'keyN' => 'value2'
                   )
               )
              //.....
           )
);


$result = searchItemsByKey($arr,'keyN');

print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
  [0] => value1
  [1] => value2
)

Function code:

function searchItemsByKey($array, $key)
{
   $results = array();

  if (is_array($array))
  {
    if (isset($array[$key]) && key($array)==$key)
        $results[] = $array[$key];

    foreach ($array as $sub_array)
        $results = array_merge($results, searchItemsByKey($sub_array, $key));
  }

 return  $results;
}
voodoo417
  • 11,861
  • 3
  • 36
  • 40
9

Here is one liner for the same,

$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];
Rahul
  • 18,271
  • 7
  • 41
  • 60
4

Even though this is an old question and has an accepted answer, Thought i would suggest one change to the accepted answer.. So first off, i agree the accepted answer is correct here.

function searchArrayKeyVal($sKey, $id, $array) {
   foreach ($array as $key => $val) {
       if ($val[$sKey] == $id) {
           return $key;
       }
   }
   return false;
}

Replacing the preset 'uid' with a parameter in the function instead, so now calling the below code means you can use the one function across multiple array types. Small change, but one that makes the slight difference.

    // Array Data Of Users
$userdb = array (
    array ('uid' => '100','name' => 'Sandra Shush','url' => 'urlof100' ),
    array ('uid' => '5465','name' => 'Stefanie Mcmohn','url' => 'urlof100' ),
    array ('uid' => '40489','name' => 'Michael','url' => 'urlof40489' ),
);

// Obtain The Key Of The Array
$arrayKey = searchArrayKeyVal("uid", '100', $userdb);
if ($arrayKey!==false) {
    echo "Search Result: ", $userdb[$arrayKey]['name'];
} else {
    echo "Search Result can not be found";
}

PHP Fiddle Example

Angry 84
  • 2,935
  • 1
  • 25
  • 24
  • Another reason i use SOF... easier to google and find my own code or something i remember.. +1 for my own public repository – Angry 84 Feb 18 '15 at 23:38
  • BTW, you are setting the result to `null` and then in the code, you are comparing it to `false`. – Taha Paksu Jun 20 '16 at 21:16
  • Corrected with returning false instead, but null might be better incase of checking for booleans – Angry 84 Jun 21 '16 at 00:46
4

I want to check tha in the following array $arr is there 'abc' exists in sub arrays or not

$arr = array(
    array(
        'title' => 'abc'
    )
);

Then i can use this

$res = array_search('abc', array_column($arr, 'title'));
if($res == ''){
    echo 'exists';
} else {
    echo 'notExists';
}

I think This is the Most simple way to define

M.suleman Khan
  • 576
  • 6
  • 17
2

No one else has used array_reduce yet, so thought I'd add this approach...

$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

Gives you more fine control over the 'search' logic than array_search().

Note that I have used strict equality here but you could opt for different comparison logic. The $carry means the comparison needs to be true once, and the final result will be TRUE.

benjaminhull
  • 730
  • 6
  • 12
  • Although, this does mean it will process ALL the items in the array, even if an early TRUE would be enough to stop and return. – benjaminhull Aug 24 '23 at 16:31
1

I had to use un function which finds every elements in an array. So I modified the function done by Jakub Truneček as follow:

function search_in_array_r($needle, $array) {
    $found = array();
    foreach ($array as $key => $val) {
        if ($val[1] == $needle) {
            array_push($found, $val[1]);
        }
    }
    if (count($found) != 0)
        return $found;
    else
        return null;
}
csi_bern
  • 5
  • 6
1

you can use this function ; https://github.com/serhatozles/ArrayAdvancedSearch

<?php 
include('ArraySearch.php');

$query = "a='Example World' and b>='2'";

$Array = array(
'a' => array('d' => '2'),
array('a' => 'Example World','b' => '2'),
array('c' => '3'), array('d' => '4'),
);

$Result = ArraySearch($Array,$query,1);

echo '<pre>';
print_r($Result);
echo '</pre>'; 

// Output:
// Array
// (
//    [0] => Array
//        (
//            [a] => Example World
//            [b] => 2
//        )
//
// )
Serhat
  • 396
  • 1
  • 5
  • 13
1
/**
 * searches a simple as well as multi dimension array
 * @param type $needle
 * @param type $haystack
 * @return boolean
 */
public static function in_array_multi($needle, $haystack){
    $needle = trim($needle);
    if(!is_array($haystack))
        return False;

    foreach($haystack as $key=>$value){
        if(is_array($value)){
            if(self::in_array_multi($needle, $value))
                return True;
            else
               self::in_array_multi($needle, $value);
        }
        else
        if(trim($value) === trim($needle)){//visibility fix//
            error_log("$value === $needle setting visibility to 1 hidden");
            return True;
        }
    }

    return False;
}
Ahad Ali
  • 398
  • 5
  • 11
1
$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);
serghei
  • 3,069
  • 2
  • 30
  • 48
1

Try this

<?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;
 }
 ?>
Maurizio Ricci
  • 462
  • 1
  • 4
  • 11
1

Just share, maybe can like this.

if( ! function_exists('arraySearchMulti')){
function arraySearchMulti($search,$key,$array,$returnKey=false)
{
    foreach ($array as $k => $val) {
        if (isset($val[$key])) {
            if ((string)$val[$key] == (string)$search) {
                return ($returnKey ? $k : $val);
            }
        }else{
            return (is_array($val) ? arraySearchMulti($search,$key,$val,$returnKey) : null);
        }
    }
    return null;
}}
1

I was looking for functionality similar to that of MySQL LIKE %term%. Based on the answers on this page. I am able to search the JSON array from a file.

user_list.json looks as sample below:

{
  "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;
}

Usage===pulling the JSON file===

 $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);
    }
ShapCyber
  • 3,382
  • 2
  • 21
  • 27
0
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

With help of above code one can find any(partially matched) data from any column in 2D array so user id can be found as required in question.

Lorenz Meyer
  • 19,166
  • 22
  • 75
  • 121
0

Expanding on the function @mayhem created, this example would be more of a "fuzzy" search in case you just want to match part (most) of a search string:

 function searchArrayKeyVal($sKey, $id, $array) {
    foreach ($array as $key => $val) {
        if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) {
            return $key;
        }
    }
         return false;
 }

For example the value in the array is Welcome to New York! and you wanted the first instance of just "New York!"

Mike Q
  • 6,716
  • 5
  • 55
  • 62
0

If question i.e.

$a = [
     [
       "_id" => "5a96933414d48831a41901f2",
       "discount_amount" => 3.29,
       "discount_id" => "5a92656a14d488570c2c44a2",
     ],
     [
       "_id" => "5a9790fd14d48879cf16a9e8",
       "discount_amount" => 4.53,
       "discount_id" => "5a9265b914d488548513b122",
     ],
     [
       "_id" => "5a98083614d488191304b6c3",
       "discount_amount" => 15.24,
       "discount_id" => "5a92806a14d48858ff5c2ec3",
     ],
     [
       "_id" => "5a982a4914d48824721eafe3",
       "discount_amount" => 45.74,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
    [
       "_id" => "5a982a4914d48824721eafe55",
       "discount_amount" => 10.26,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
   ];

Ans:

function searchForId($id, $array) {
    $did=0;
    $dia=0;
   foreach ($array as $key => $val) {
       if ($val['discount_id'] === $id) {
           $dia +=$val['discount_amount'];
           $did++;
       }
   }
    if($dia != '') {
        echo $dia;
        var_dump($did);
    }
   return null;
};
print_r(searchForId('5a928ce414d488609e73b443',$a));
0

Here is a better solution, in case your pulling data from a database or a multidimensional array

Example of a multidimensional array:

$records = array(
            array(
                'id' => 2135,
                'first_name' => 'John',
                'last_name' => 'Doe',
            ),
            array(
                'id' => 3245,
                'first_name' => 'Sally',
                'last_name' => 'Smith',
            ),
            array(
                'id' => 5342,
                'first_name' => 'Jane',
                'last_name' => 'Jones',
            ),
            array(
                'id' => 5623,
                'first_name' => 'Peter',
                'last_name' => 'Doe',
            )
            );


            function search_user_by_name($name, $array) {
                             foreach ($array as $keys) {
                                 foreach ($keys as $key => $_user_record) {
                                     if ($_user_record == $name) {
                                         return [$key => $_user_record];//Return and array of user
                                     }
                                 }
                             }
                             return null;
                        }

Call the function:

$results = search_user_by_name('John', $records);
         print_r($results);
         

Output: Array ( [first_name] => John )