Поиск по массиву - PullRequest
       24

Поиск по массиву

0 голосов
/ 13 сентября 2011

Допустим, у меня есть следующий массив:

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

Как выполнить поиск в этом массиве так, чтобы я возвращал родительские ключи так, чтобы значение было определенным значением, основанным на субключе?
например, вернуть ключи так, чтобы key.1 == tester (это вернуло бы key1)
например, вернуть ключи так, чтобы key.1 == failtester (это вернуло бы key2)
например, вернуть ключи так, чтобы этот ключ.2 == tester (это вернуло бы массив (key1, key2)

Возможно ли это без выполнения цикла for?

Редактировать: Используя PHP (извините, я сказал PHP, очевидно, нет.. #fail)

Ответы [ 3 ]

0 голосов
/ 13 сентября 2011

Вы можете использовать хеш-таблицу.Каждое местоположение хэша будет связанным списком ключей, которые хэшируются к этому термину.Это также будет выполнять поиск в постоянное время!

0 голосов
/ 14 сентября 2011

Решение 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
0 голосов
/ 13 сентября 2011

А вот и вы:

$results = array();
foreach ($array as $key => $item) {
    if ($item['key.1'] == 'tester') $results[] = $key;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...