2014-10-28 103 views
0

陣列我有一個數組,看起來像這樣:通過搜索鍵分支

$array = array (
    [level_1] => array (
     [level_2] => array (
      [level_3] => something 
     ) 
    ), 
    [level_12] => array (
     [level_2] => somethingelse 
    ), 
    [level_13] => array (
     [level_22] => array (
      [level_3] => something 
     ) 
    ), 
); 

的鍵或值不總是唯一的,但分支。
我有一個字符串,它看起來像這樣:

$string = 'level_1-level_2-level_3'; 

這些都是對一個分支的關鍵。

而我需要以某種方式從基於該字符串的數組中獲取值? 像這樣:

$string_array = explode('-', $string); 
$array[$string_array[0]][$string_array[1]][$string_array[2]] // something 

但由於深度可以是不同的,這不是可行的解決方案...

+0

你需要創建一個遞歸函數,什麼收集結果。 – vaso123 2014-10-28 22:33:59

+0

只需創建一個名爲$ result的變量,使其等於$ array,然後在您的$ string_array上創建一個循環,使$ result = $ result [$ string_array [$ i]] – 2014-10-28 22:36:29

回答

1

試試這個簡單的例子,沒有必要遞歸函數:

function get_item($path, $array) 
{ 
    $paths = explode('-', $path); 

    $result = $array;  
    foreach ($paths as $path) { 
     isset($result[$path]) ? $result = $result[$path] : $result = false; 
    } 

    return $result; 
} 

$path = 'level_1-level_2-level_3'; 
echo get_item($path, $array); 
+0

如果結果爲假,不應該在循環中出現中斷嗎?或者可以將布爾值視爲數組嗎? – 2014-10-28 23:28:16

+0

我想它應該,但是當使用'isset()'時,PHP不會發出任何警告或通知 – Danijel 2014-10-28 23:39:32

+0

不錯。很高興知道謝謝 – 2014-10-28 23:47:19

0

使通過各級一個$result變量最初指向數組的根目錄,和環的$string_array直到$result點您正在尋找的葉。

// stuff you already have: 

$array = array(...); // your big array 
$string = 'level_1-level_2-level_3'; 
$string_array = explode('-', $string); 

// new stuff: 

$result = $array; 
foreach ($string_array as $level) { 
    $result = $result[$level]; 
} 

echo $result; // 'something' 

工作例如:Ideone

+0

如果'$ string'沒問題,但如果不是,它會拋出未定義的索引錯誤。 – Danijel 2014-10-28 22:50:17

1

試試這個:

$array = array (
    'level_1' => array (
     'level_2' => array (
      'level_3' => 'something' 
     ) 
    ), 
    'level_12' => array (
     'level_2' => 'somethingelse' 
    ), 
    'level_13' => array (
     'level_22' => array (
      'level_3' => 'something' 
     ) 
    ), 
); 
$string = 'level_1-level_2-level_3'; 
$keys = explode('-', $string); 

echo getItemIterative($keys, $array); 
echo "\n"; 
echo getItemRecursive($keys, $array); 


function getItemIterative($keys, $array) 
{ 
    $value = null; 
    foreach ($keys as $key) { 
     if ($value == null) { 
      $value = $array[$key]; 
     } 
     if (is_array($value) && array_key_exists($key, $value)) { 
      $value = $value[$key]; 
     } 
    } 
    return $value; 
} 

function getItemRecursive($keys, $array) 
{ 
    $key = array_shift($keys); 
    $value = $array[$key]; 
    if (empty($keys)) { 
     return $value; 
    } else { 
     return getItemRecursive($keys, $value); 
    } 
}