2013-06-04 58 views
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'); 

,然後得到「測試值」早在我的$值變量的值。

在這種情況下它的工作原理,但它僅僅是不動的,我希望它能夠處理可能連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 [$ key]:null''而不是'$ data = $ data [$ key]''?如果沒有這樣的密鑰,'$ data''將會是空的?!? – 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));