我正在试图找出如何获取字符串,解析它,并获得与解析后的键匹配的相应数组值。我不知道如何正确解释这个,所以这是一个例子。
$testArray = array(
'router' => array(
'format' => 'xml',
),
);
我要解析的字符串将如下所示 - router.format
,我显然希望将xml
作为字符串返回。传入的字符串可以具有任意数量的分隔周期。我想的是以某种方式进行递归,但我想不出任何可行的方法。
这与SF2的服务容器以及恢复服务的方式非常相似。
任何帮助都会很棒!
答案 0 :(得分:3)
可能需要进行一些错误检查:
$testArray = array(
'router' => array(
'format' => 'xml',
),
);
$path = 'router.format';
$result = $testArray;
foreach(explode('.', $path) as $key) {
if(isset($result[$key])) {
$result = $result[$key];
}
}
print_r($result);
答案 1 :(得分:1)
<?php
$string = 'router.format';
$array = array(
'router' => array(
'format' => 'xml',
),
);
$string = explode('.', $string);
$result = $array;
for($i = 0; $i < count($string); ++$i)
{
$key = $string[$i];
if(isset($result[$key]))
$result = $result[$key];
else
break;
}
print_r($result);
答案 2 :(得分:1)
Laravel有一个帮助函数,可以执行此操作:http://laravel.com/api/source-function-array_get.html#226-251
该功能的代码是:
function array_get($array, $key, $default = null)
{
if (is_null($key)) return $array;
if (isset($array[$key])) return $array[$key];
foreach (explode('.', $key) as $segment)
{
if ( ! is_array($array) or ! array_key_exists($segment, $array))
{
return value($default);
}
$array = $array[$segment];
}
return $array;
}
function value($value)
{
return $value instanceof Closure ? $value() : $value;
}
用法:
array_get($testArray, 'router.format');
答案 3 :(得分:0)
递归方法。
function array_path($keys, $array) {
$key = array_shift($keys);
if (!isset($array[$key])) { return false; }
return !empty($keys) ? array_path($keys, $array[$key]) : $array[$key];
}
$testArray = array(
'router' => array(
'format' => 'xml',
),
);
$keys = explode('.', 'router.format');
var_dump(array_path($keys, $testArray));