PHP怎么搜索数组的键并查找到对应的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP怎么搜索数组的键并查找到对应的值?相关的知识,希望对你有一定的参考价值。

目的:先搜索数组中是否存在该键,如果存在则输出该键和对应的值。
我知道用array_search可以通过搜索值找到对应的键,但怎么通过搜索键找到对应的值?
$a=array("a"=>"red","b"=>"green","c"=>"blue");
echo array_search("red",$a);

array_search()函数在一个数组中搜索一个指定的值,如果找到则返回相应的键,否则返回FALSE1.搜索关联数组键如果在一个数组中找到一个指定的键,函数array_key_exists()返回TRUE,否则返回FALSE。其形式如下:boolean array_key_exists(mixed key, array array)下面的例子将在数组键中搜索Ohio,如果找到,将输出这个州加入育关信息:$state["Delaware"]="December 7,1787";$state["Pennsylvania"]="December 12, 1787";$state["Ohio"]="March l,1803";86 第5章数 组if (array_key_exists("Ohio", $state》printf("Ohio joined the Union on %s", $state["Ohio"]);结果如下:2.搜索关联数组值array_search()函数在一个数组中搜索一个指定的值,如果找到则返回相应的键,否则返回FALSE。其形式如下:下面的例子在$state中搜索一个特定的日期(December7),如果找到,则返回相应州的有关信息:$state["Ohio"] = "March l"; .$statef"Delaware"l = "December 7";$state["Pennsylvania"] = "December 12u;$founded = array_search("December 7", $state),i+ ($founded) printf("%s was founded on %s.", $founded, $state[$founded]);输出如下:Delaware was十ounded on December 7.5.4.2获取数组键array_keys()函数返回一个数组,其中包含所搜索数组中找到的所有键。其形式知下:array array_keys(array array【J mixed search_value])如果包含可选参数search value,则只会返回与该值匹配的键。下面的例子将输出$state数组中找到的所有键值:$state["Delaware"] = "December 7, 1787";$state["Pennsylvania"] = "December 12, i787";$state["New Jersey"] = "December 18, 1787";$keys = array_keys($state);print_r($keys);输出如下:5.4.3获取数组值array_values()函数返回一个数组中的所有值,并自动为返回的数组提供数值索引。其形式如下:array array_values(array array)5.5遍历数组 87下面的例子将获取$population中找到的各州人口数:$population=array("Ohio"=>"11,421,267", "Iowa"=>"2,936,760");print_r(array_values($population》;这个例子的输出如下:5.5遍历数组通常需要遍历数组并获得各个键或值(或者同时获得键和值),所以毫不奇怪,php为此提供了一些函数来满足需求。许多函数能完成两项任务,不仅能获取当前指针位置的键或值,还能将指针移向下一个适当的位置。本节将介绍这些函数。5.5.1 获取当前数组键key()函数返回input_array中当前指针所在位置的键。其形式如下:mixed key(array array)下面的例子通过迭代处理数组并移动指针来输出$capitals数组的键:$capitals=array("Ohio"=>"Columbus", "Iowa"=>"Des Moines");echo "<p>Can you name the capitals of these states?</p>";while($key=key($capitals》printf("%s <br,>“,$key);next($capitals);,将返回以下结果:Ohio 参考技术A echo isset($a['c'])? 'c存在'.$a['c'] : 'c不存在';

PHP多维数组搜索(按特定值查找键)

【中文标题】PHP多维数组搜索(按特定值查找键)【英文标题】:PHP Multidimensional Array Searching (Find key by specific value) 【发布时间】:2011-12-27 11:35:35 【问题描述】:

我有这个多维数组。我需要搜索它并只返回与“slug”的值匹配的键。我知道还有其他关于搜索多维数组的主题,但我对我的情况还不够了解。非常感谢您的帮助!

所以我需要一个类似的函数:

myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1

这是数组:

$products = array (
1  => array(
        'name'          => 'The Breville One-Touch Tea Maker',
        'slug'          => 'breville-one-touch-tea-maker-BTM800XL',
        'shortname'     => 'The One-Touch Tea Maker',
        'listprice'     => '299.99',
        'price'         => '249.99',
        'rating'        => '9.5',
        'reviews'       => '81',
        'buyurl'        => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
        'videoref1'     => 'xNb-FOTJY1c',
        'videoref2'     => 'WAyk-O2B6F8',
        'image'         => '812BpgHhjBML.jpg',
        'related1'      => '2',
        'related2'      => '3',
        'related3'      => '4',
        'bestbuy'       => '1',
        'quote'         => '',
        'quoteautor'    => 'K. Martino',
        ),

2  => array(
        'name'          => 'Breville Variable-Temperature Kettle BKE820XL',
        'slug'          => 'breville-variable-temperature-kettle-BKE820XL',
        'shortname'     => 'Variable Temperature Kettle',
        'listprice'     => '199.99',
        'price'         => '129.99',
        'rating'        => '9',
        'reviews'       => '78',
        'buyurl'        => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
        'videoref1'     => 'oyZWBD83xeE',
        'image'         => '41y2B8jSKmwL.jpg',
        'related1'      => '3',
        'related2'      => '4',
        'related3'      => '5',
        'bestbuy'       => '1',
        'quote'         => '',
        'quoteautor'    => '',
        ),
);

【问题讨论】:

你可以通过我在这里发布的课程来做到这一点:***.com/a/69304668/4276501 【参考方案1】:

另一个可能的解决方案是基于array_search() 函数。您需要使用 PHP 5.5.0 或更高版本。

示例

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

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

echo ("The key is: ".$key);
//This will output- The key is: 2

说明

函数array_search() 有两个参数。第一个是您要搜索的值。第二个是函数应该搜索的位置。函数array_column()获取键为'uid'的元素的值。

总结

所以你可以把它用作:

array_search('breville-one-touch-tea-maker-BTM800XL', array_column($products, 'slug'));

或者,如果您愿意:

// define function
function array_search_multidim($array, $column, $key)
    return (array_search($key, array_column($array, $column)));


// use it
array_search_multidim($products, 'slug', 'breville-one-touch-tea-maker-BTM800XL');

原始示例(由 xfoxawy 提供)可以在 DOCS 上找到。array_column()page。


更新

由于 Vael 的评论我很好奇,所以我做了一个简单的测试来衡量使用 array_search 的方法和接受的答案中提出的方法的性能。

我创建了一个包含 1000 个数组的数组,结构是这样的(所有数据都是随机的):

[
      
            "_id": "57fe684fb22a07039b3f196c",
            "index": 0,
            "guid": "98dd3515-3f1e-4b89-8bb9-103b0d67e613",
            "isActive": true,
            "balance": "$2,372.04",
            "picture": "http://placehold.it/32x32",
            "age": 21,
            "eyeColor": "blue",
            "name": "Green",
            "company": "MIXERS"
      ,...
]

我运行了 100 次搜索测试,为名称字段搜索不同的值,然后计算出平均时间(以 毫秒 为单位)。 Here你可以看一个例子。

结果是,在这个答案上提出的方法需要大约 2E-7 才能找到值,而接受的答案方法需要大约 8E-7。

就像我之前所说的,对于使用这种大小的数组的应用程序来说,这两次都是完全可以接受的。如果尺寸增长很多,比如 1M 元素,那么这个小差异也会增加。

更新二

我已经为基于array_walk_recursive 的方法添加了一个测试,这里的一些答案中提到了该方法。得到的结果是正确的。如果我们专注于性能,它比在test 上检查的其他人要差一些。在测试中可以看到比基于array_search的方法慢了10倍左右。同样,对于大多数应用程序来说,这并不是一个非常相关的区别。

更新 III

感谢@mickmackusa 发现此方法的一些限制:

此方法在关联键上会失败。 此方法仅适用于索引子数组(从 0 开始并具有连续升序的键)。

【讨论】:

有人知道这个的性能吗?看起来它最终会更慢,并且仍然需要 5.5。我在 5.4 上无法测试。 对于任何不明白的人:在 php 7 中,for 循环更快。当我在那个 eval.in 示例中更改为 5.6 时,array_search 稍微快了一点。 聪明!我正在做一些类似的事情,使用 array_combine() 和 array_column() 来创建另一个数组,用一个已知的键来获取我的数据,但这更优雅。 array_search()array_column() 一起使用将不适用于OP 的样本数组,因为子数组键从1 开始。此方法也将在关联键上失败。此方法仅适用于索引子数组(从0 开始并具有连续升序的键)。这样做的原因是因为array_column() 会在其返回的数组中生成新的索引。 完全正确@mickmackusa,我已将您的知识添加到答案中。感谢您的帮助【参考方案2】:

使用此功能:

function searchThroughArray($search,array $lists)
        try
            foreach ($lists as $key => $value) 
                if(is_array($value))
                    array_walk_recursive($value, function($v, $k) use($search ,$key,$value,&$val)
                        if(strpos($v, $search) !== false )  $val[$key]=$value;
                    );
            else
                    if(strpos($value, $search) !== false )  $val[$key]=$value;
                

            
            return $val;

        catch (Exception $e) 
            return false;
        
    

并调用函数。

print_r(searchThroughArray('breville-one-touch-tea-maker-BTM800XL',$products));

【讨论】:

不错的答案。您可以在我的回答中查看您的提案的执行情况 只有代码的答案在 *** 上的价值很低。请更新您的帖子以解释您的叶节点子字符串搜索功能的工作原理。此方法并非专门设计为按照 OP 的要求工作,因此澄清差异很重要。演示链接将大大提高读者的理解力。始终发布旨在教育 OP 和更多 SO 受众的答案。【参考方案3】:

我会在下面这样做,其中$products 是一开始问题中给出的实际数组。

print_r(
  array_search("breville-variable-temperature-kettle-BKE820XL", 
  array_map(function($product)return $product["slug"];,$products))
);

【讨论】:

【参考方案4】:

对于下一个来访者:使用递归数组遍历;它访问多维数组中的每个“叶子”。以下是灵感:

function getMDArrayValueByKey($a, $k) 
    $r = [];
    array_walk_recursive ($a, 
                          function ($item, $key) use ($k, &$r) if ($key == $k) $r[] = $item;
                          );
    return $r;

【讨论】:

没问题!只是为了节省您的时间,如果您尝试 josef answer,该函数将返回一个包含一个元素的数组。关键是想要的答案:) @Ivan josef 的回答与这个非常不同。你自己测试过吗。我一直在关注这个答案,但我认为它行不通,因为 array_walk_recursive 看不到一个级别。对于每个第一级键,josef 正在调用 strpos 或检查所有叶节点。看出区别了吗? 当然@mickmackusa 但是汉斯给出了某种灵感,答案不是字面上给出的解决方案。正如约瑟夫在他的回答中所做的那样,它需要更多的阐述。但是,您说得对,这个答案并不能完全解决问题。 不能正确解决所提问题的答案是“不正确的”,可能会误导/混淆研究人员。【参考方案5】:

试试这个

function recursive_array_search($needle,$haystack) 
        foreach($haystack as $key=>$value) 
            $current_key=$key;
            if($needle==$value['uid'] OR (is_array($value) && recursive_array_search($needle,$value) !== false)) 
                return $current_key;
            
        
        return false;
    

【讨论】:

纯代码答案在 *** 上的价值很低。请更新您的帖子以解释您的递归方法的工作原理、合适的情况以及递归是不必要开销的情况。始终发布旨在教育 OP 和更多 SO 受众的答案。附:我认为大多数 php 开发人员会更喜欢 &amp;&amp;|| 而不是 ANDOR 在您的情况下。没有理由声明current_key$needle 的比较应该是严格的。【参考方案6】:

很简单:

function myfunction($products, $field, $value)

   foreach($products as $key => $product)
   
      if ( $product[$field] === $value )
         return $key;
   
   return false;

【讨论】:

如果您在条件语句中使用此函数,您将需要对类型进行绝对检查,因为返回的键有时可能具有 [0] 的索引。因此,如果进行条件检查,它应该看起来像这样:if (myfunction($array, 'field', 'value') !== FALSE )) // do something... 实现最佳性能和技术人员理解的简单解决方案。 谢谢。它简单可靠。我已经测试了这个和 , array_search($value, array_column($searchArray, $searchKey)) 替代方案。我从 array_search()/array_column 方法得到不正确的结果。【参考方案7】:
function search($array, $key, $value) 
 
    $results = array(); 

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

        foreach ($array as $subarray) 
            $results = array_merge($results, search($subarray, $key, $value)); 
     

    return $results; 
 

【讨论】:

只有代码的答案在 *** 上的价值很低。请更新您的帖子以解释您的递归方法的工作原理、合适的情况以及递归是不必要开销的情况。始终发布旨在教育 OP 和更多 SO 受众的答案。【参考方案8】:

该类方法可以通过多个条件在数组中搜索:

class Stdlib_Array

    public static function multiSearch(array $array, array $pairs)
    
        $found = array();
        foreach ($array as $aKey => $aVal) 
            $coincidences = 0;
            foreach ($pairs as $pKey => $pVal) 
                if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) 
                    $coincidences++;
                
            
            if ($coincidences == count($pairs)) 
                $found[$aKey] = $aVal;
            
        

        return $found;
        


// Example:

$data = array(
    array('foo' => 'test4', 'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test1', 'bar' => 'baz3'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz4'),
    array('foo' => 'test4', 'bar' => 'baz1'),
    array('foo' => 'test',  'bar' => 'baz1'),
    array('foo' => 'test3', 'bar' => 'baz2'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test',  'bar' => 'baz'),
    array('foo' => 'test4', 'bar' => 'baz1')
);

$result = Stdlib_Array::multiSearch($data, array('foo' => 'test4', 'bar' => 'baz1'));

var_dump($result);

将产生:

array(2) 
  [5]=>
  array(2) 
    ["foo"]=>
    string(5) "test4"
    ["bar"]=>
    string(4) "baz1"
  
  [10]=>
  array(2) 
    ["foo"]=>
    string(5) "test4"
    ["bar"]=>
    string(4) "baz1"
  

【讨论】:

你好宿命论者***.com/questions/40860030/…。与这些问题有关,您能澄清一下这个问题吗

以上是关于PHP怎么搜索数组的键并查找到对应的值?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 sql 的键值对搜索 php 多维关联数组,例如 '%LIKE%' 构造

DataWhale编程一

检查哪些字典键对应的数组包含某个字符串

php [php:array_search()]按值搜索数组中的键。 #PHP

哈希算法原理

我的表单键没有在颤振中验证,即使在我将它用作表单中的键并输入合适的值之后