2014-10-28 87 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); 
    } 
}