PHP 多维数组按值搜索



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

我尝试制作循环,但我想要更快的执行代码。

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

这将起作用。你应该这样称呼它:

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

重要的是要知道,如果您使用运算符===比较类型必须完全相同,在此示例中,您必须搜索string或仅使用 == 而不是===

基于安戈鲁的回答。在更高版本的PHP(>= 5.5.0(中,你可以使用单行。

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

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

如果你

正在使用(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,你可以使用这个向后移植,谢谢拉姆齐!

更新:我一直在做一些简单的基准测试,多结果表单似乎是最快的,甚至比 Jakub 自定义函数还要快!

在更高版本的 PHP (>= 5.5.0( 中,您可以使用以下单行代码:

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

看起来array_filter将是合适的解决方案...

$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代码

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

基于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);

我知道

这已经得到了回答,但我使用了这个并在我的代码中对其进行了更多的扩展,这样您就不会只通过 uid 进行搜索。我只想将其分享给可能需要该功能的任何其他人。

这是我的例子,请记住这是我的第一个答案。我取出了参数数组,因为我只需要搜索一个特定的数组,但您可以轻松地添加它。我想基本上搜索的不仅仅是 uid。

此外,在我的情况下,由于其他字段的搜索可能不是唯一的,可能会返回多个键。

 /**
     * @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;
    }
后来,我

最终写了这篇文章,以允许我搜索另一个值和关联键。因此,我的第一个示例允许您在任何特定的关联键中搜索值,并返回所有匹配项。

第二个示例显示在一个特定的关联键 (first_name( 中找到一个值 ('Taylor'(,另一个关联键 (已使用( 中找到另一个值 (true(,并返回所有匹配项(使用名字为"Taylor"和的人被雇用的键(。

/**
 * @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;
}

功能的使用

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

结果

Array ( [0] => 2 ) 
你可以

通过组合两个函数来做到这一点,array_searcharray_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是问题中定义的数组。

引用:

array_search php.net

array_column php.net

我修改了下面的描述函数array_search的示例之一。函数searchItemsByKey从多维数组(N 个级别(中按$key返回所有值。也许,这对某些人有用。例:

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

这是相同的一行,

$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];

尽管这是一个古老的问题并且有一个公认的答案,但我想我会建议对接受的答案进行一次更改。所以首先,我同意这里接受的答案是正确的。

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

将预设的"uid"替换为函数中的参数,因此现在调用以下代码意味着您可以在多个数组类型中使用一个函数。小变化,但略有不同。

    // 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 小提琴示例

我想

检查以下数组中的 tha $arr子数组中是否存在"abc">

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

然后我可以使用这个

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

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

还没有其他人使用过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。

我不得不使用 un 函数来查找数组中的每个元素。所以我修改了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;
}
/**
 * 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;
}
您可以使用

此函数;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
//        )
//
// )
$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);

试试这个

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

只是分享,也许可以像这样。

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

我正在寻找类似于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);
    }
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;
 }

例如,数组中的值是"欢迎来到纽约!",而你只需要"New York!

如果问题,即

$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",
     ],
   ];

答:

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

这是一个更好的解决方案,以防您从数据库或多维数组中提取数据

多维数组示例:

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

调用函数:

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

输出:Array ( [first_name] => John )

相关内容

  • 没有找到相关文章

最新更新