我陷入了两难境地,我正在尝试创建一个“动态”搜索数组的函数,在这种情况下是我的会话数组,但它应该适用于任何数组。现在这不是我的问题,我的问题是动态地允许这样做......
这就是我所拥有的
public static function get($search = 'First/Second/Third') {
$explode = explode('/',$search);
$count = count($explode);
if ($count == 1)
if (isset($_SESSION[$explode[0]]))
return $_SESSION[$explode[0]];
elseif ($count == 2)
if (isset($_SESSION[$explode[0]][$explode[1]]))
return $_SESSION[$explode[0]][$explode[1]];
elseif ($count == 3)
if (isset($_SESSION[$explode[0]][$explode[1]][$explode[2]]))
return $_SESSION[$explode[0]][$explode[1]][$explode[2]];
}
所以,假设我有一个数组:
array('First' => array('Second' => array('Third' => 'TEST VALUE'));
现在我想打电话
$value = get('First/Second/Third');
然后将“Test Value”作为my value变量的值返回。
在这种情况下它可以工作,但它不是动态的,我希望它能够处理甚至10层深的数组,而不会添加越来越多的线....
那么也许有人在这里比我更聪明:)
谢谢!
答案 0 :(得分:7)
$array = array(
'First' => array(
'Second' => array(
'Third' => 'TEST VALUE'
)
)
);
echo get($array, 'First/Second/Third'); // TEST VALUE
使用的功能
function get($data, $part) {
foreach(explode("/", $part) as $key) {
$data = isset($data[$key]) ? $data[$key] : null;
}
return $data;
}
答案 1 :(得分:1)
这样的事情:
$data = $_SESSION;
foreach(explode('/', $seach) => $pos) {
$data = $data[$pos];
}
return $data;
答案 2 :(得分:1)
你可以尝试这样的事情。它执行递归树搜索。如果没有找到匹配,它将返回false
否则它将返回所需路径上的分支或叶子。
function treeSearch($query, $array, $currentDepth = 0){
if (is_string($query)) $query = explode("/", $query);
$term = $query[$currentDepth];
if (isset($array[$term])){
if ($currentDepth == count($query)-1){
// we found it
return $array[$term];
} else {
return treeSearch($query, $array[$term], ++$currentDepth);
}
} else {
// no matching branch;
return false;
}
}
示例用法
$array = array('First' => array('Second' => array('Third' => 'TEST VALUE')));
print_r(treeSearch("First/Second", $array));
print_r(treeSearch("First", $array));
print_r(treeSearch("First/Second/Third", array));