如何使用键数组搜索多维数组

时间:2016-03-25 18:52:49

标签: php arrays multidimensional-array

想象一下,您拥有以下数据结构。配置一是配置值的散列。搜索是一个散列键数组,用于从配置散列中提取配置值。

$config['users']['students']['default']['school'] = 'Garfield High';
$config['users']['students']['default']['domain'] = 'ghs.com';
$config['users']['teacher']['default']['fruit'] = 'apple';
$config['school']['superintendent'] = 'Boris York';

$search[] = 'users';
$search[] = 'students';
$search[] = 'default';
$search[] = 'school';

使用$ search数组获取“加菲猫高”值的最有效方法是什么。

这听起来像是一项学校作业,但事实并非如此。我徘徊在一个兔子洞里,虽然我可能会放弃我正在做的事情,但我很好奇如何最好地解决这个问题。看起来应该很容易,但出于某种原因,我很难过。

从$ config中提取值的方法应该适用于任何$ search数组大小。它还需要使用$ search = array('school','superintendent')。

public function get($search, $config) {
    // Somehow pull value from $config

}

2 个答案:

答案 0 :(得分:2)

这是一个简单的循环,使用$search的每个元素作为被搜索数组的下一级别的键。

public function get($search, $config) {
    $result = $config;
    foreach ($search as $key) {
        if (is_array($result) && isset($result[$key])) {
            $result = $result[$key];
        } else {
            return false; // not found
        }
    }
    return $result;
}

DEMO

答案 1 :(得分:0)

RecursiveIteratorIterator类的替代解决方案:

$config = ['users' => ['students' => ['default' => ['school' => 'Garfield High'], 'highschool' => ['domain' => 'highschool.ghs.com']]]];

$search1 = ['users', 'students', 'default', 'school'];
$search2 = ['users', 'students', 'highschool', 'domain'];

function getConfigItem($search = [], $config = []) {
    $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($config), \RecursiveIteratorIterator::SELF_FIRST);
    $result = "";
    foreach ($iterator as $k => $v) {
        if ($search[$iterator->getDepth()] == $k && is_string($v)) {
            $result = $v;
        }
    }
    return $result;
}

var_dump(getConfigItem($search1, $config));  // string 'Garfield High'

var_dump(getConfigItem($search2, $config));  // string 'highschool.ghs.com'

http://php.net/manual/en/class.recursiveiteratoriterator.php