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 変数の値として "Test Value" を取得します。

この状況では機能しますが、動的ではありません。行を追加することなく、10層の深さの配列でも処理できるようにしたいと考えています....

たぶん、私より賢い誰かがここにいます:)

ありがとう!!

4

3 に答える 3

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 に答える