【问题标题】:Array Searching数组搜索
【发布时间】:2011-09-13 18:42:55
【问题描述】:

假设我有以下数组:

array(
    'key1'=>array(
        'key.1'=>'tester',
        'key.2'=>'tester'
    ),
    'key2'=>array(
        'key.1'=>'failedtester',
        'key.2'=>'tester'
    )
)

如何搜索此数组,以便返回父键,使得值是基于子键的某个值?
例如返回 key.1 == tester 的键(这将返回 key1)
例如返回 key.1 == failedtester 的密钥(这将返回 key2)
例如返回 key.2 == tester 的键(这将返回 array(key1, key2)

这可能不做一个for循环吗?

编辑:使用 PHP(对不起,我说的是 PHP,显然不是……#fail)

【问题讨论】:

  • 什么语言?还是真的与语言无关?
  • 猜你正在使用 PHP?你真的应该告诉我们你使用的是什么语言......
  • @xanatos 基于用户的标签,看起来像php
  • @all 谢谢,我想...但我不会“盲目地”添加语言标签:-)
  • 很抱歉。我以为我已经添加了它,但显然没有。感谢您为我添加它。

标签: php arrays search multidimensional-array


【解决方案1】:

方案一:两个嵌套循环,总时间复杂度为O(n*n):

function search1($a, $key, $val) {
    $result = array();
    foreach ($a as $a_key => $a_arr) {
       foreach ($a_arr as $k => $v) {
           if ($k == $key && $v == $val) {
               $result[] = $a_key;
           }
        }
    }
    return $result;
}
$result = search1($a, "key.1", "tester"); // call

解决方案 2: 内部循环被替换为查找,总复杂度为 O(n*log(n))。对于较大的 n,这应该会明显更快:

function search2($a, $key, $val) {
    $result = array();
    foreach ($a as $a_key => $a_arr) {
        if (array_key_exists($key, $a_arr) && $a_arr[$key] == $val) {
               $result[] = $a_key;
        }
    }
    return $result;
}
$result = search2($a, "key.1", "tester"); // call

【讨论】:

    【解决方案2】:

    给你:

    $results = array();
    foreach ($array as $key => $item) {
        if ($item['key.1'] == 'tester') $results[] = $key;
    }
    

    【讨论】:

    • 我正在尝试寻找不使用 lopping 的解决方案。
    • @Aram Papazian,无论哪种方式,都会涉及到一个循环。没有你想要的内置 PHP 函数,任何你想要的函数都将使用循环。
    • @simshaun 那行得通。我只是想弄清楚是否有办法在不循环的情况下做到这一点。如果没有,那就行得通。 (我已经创建了一个循环版本,但正试图找到一个不循环的更有效的版本。)谢谢!
    【解决方案3】:

    您可以使用哈希表。散列的每个位置都是散列到该术语的键的链接列表。这也会在恒定时间内运行您的搜索!

    【讨论】:

    • 数组中的数据是否已预先排序?是否必须使用标准的多维数组来存储数据,还是可以使用不同的数据结构?
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 2011-09-12
    • 2015-07-02
    • 2018-08-31
    • 2014-12-02
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多