5

我遇到了两难境地,我正在尝试创建一个函数来“动态”搜索数组,在本例中是我的会话数组,但它应该适用于任何数组。现在这不是我的问题,我的问题是动态地允许这样做......

这就是我所拥有的

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');

然后将“测试值”作为我的 $value 变量的值。

在这种情况下它可以工作,但它不是动态的,我希望它能够处理甚至 10 层深的数组,而无需添加越来越多的行......

好吧,也许有人比我更聪明:)

谢谢!!

4

3 回答 3

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;
}

现场演示

于 2013-06-04T19:44:14.783 回答
1

你可以尝试这样的事情。它进行递归树搜索。如果未找到匹配项,它将返回一个falseelse,它将返回所需路径的分支或叶。

     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));
于 2013-06-04T19:58:20.883 回答
1

像这样的东西:

$data = $_SESSION;
foreach(explode('/', $seach) => $pos) {
    $data = $data[$pos];
}
return $data;
于 2013-06-04T19:43:42.750 回答