想象一下,您拥有以下数据结构。配置一是配置值的散列。搜索是一个散列键数组,用于从配置散列中提取配置值。
$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
}
答案 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;
}
答案 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