使用PHP多维数组按值搜索

473

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

我尝试使用循环,但我想要一个更快执行的代码。


有趣的是,下划线(lowdash)库将此功能添加到JavaScript中... - ErichBSchulz
12
我编写了一个脚本来测试几个答案的性能。它生成一个包含500,000个数组的数组,并在其中搜索最后一个成员中的值。我将像已接受答案一样的函数与两个“array_column”单行答案进行比较。我对它们进行了修改,使其返回实际发现的数组,而不仅仅是键,因为通常这是我的用例。每种方法运行1000次的平均微延迟,函数方法得分为0.361,search-col为0.184,keys-col为0.189。 - Josh
23个回答

4

我想检查在以下数组$arr中,是否存在子数组中的'abc'

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

然后我可以使用这个。
$res = array_search('abc', array_column($arr, 'title'));
if($res == ''){
    echo 'exists';
} else {
    echo 'notExists';
}

我认为这是定义最简单的方式。

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()更精细的“搜索”逻辑控制。
请注意,我在这里使用了严格相等性,但您可以选择不同的比较逻辑。$carry表示比较需要为真一次,并且最终结果将为TRUE。

虽然如此,这意味着它将处理数组中的所有项目,即使早期的TRUE足以停止并返回。 - benjaminhull

1

只是分享,也许会喜欢这个。

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

1
我正在寻找与MySQL LIKE %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);
    }

1

我必须使用一个函数,该函数可以在数组中找到每个元素。因此,我修改了Jakub Truneček编写的函数,如下所示:

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

1
你可以使用这个函数; 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
//        )
//
// )

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

1

试试这个

<?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;
 }
 ?>

0
扩展@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!”,而您只想获取第一个实例的“New York!”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接