2013-06-04 18 views
5

私はジレンマに陥っています。配列をトラッキングするための関数を作成しようとしていますが、この場合はセッション配列です。配列を使った動的検索

array('First' => array('Second' => array('Third' => 'TEST VALUE')); 

:今ではここで私は

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

それでは、私は配列を持っているとしましょうしているものだ...私の問題は、動的にこれを行うことができるようにすることで、

私の問題ではありません今すぐ電話したいと思っています

$value = get('First/Second/Third'); 

次に、「テスト値」をmy $ value変数の値として戻します。それが動作します。この状況で

、それだけで動的ではない、と私はより多くの行を追加することなく、同様に多分10層の深配列を扱うことができるようにしたい....

まあ、もっと賢い人がいるかもしれません:)

ありがとう!!このような

答えて

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

Live Demo

+0

これは素晴らしい解決策です。私はこの問題が一度起こったときに私がeval()に再発したことを認めて恥ずかしいです。 – Andri

+0

しかし、なぜ '' $ data = isset($ data [$ key])? '' $ data = $ data [$ key] ''の代わりに$ data [$ key]:null''を使用しますか?そのようなキーがない場合、 '' $ data''はnullになりますか? – mzedeler

+0

素晴らしい!!!!私はこの素敵で清潔な解決策を愛しています、それは単に完璧です!ありがとう! –

1

何か:

$data = $_SESSION; 
foreach(explode('/', $seach) => $pos) { 
    $data = $data[$pos]; 
} 
return $data; 
+2

変更 '=> $ posの、' 'as'に...と'置く; '' $データ= $データの後に[$ valの]を 'と、それ動作するはずです –

+0

はい。あなたが正しい。カウント以外の値を使用しないことで混乱します。 – mzedeler

+0

ありがとうmzdeler、私はあなたと馬場が同じように考える。ありがとう!!! –

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