解析字符串以获取数组元素

时间:2014-08-04 20:08:33

标签: php arrays

我正在试图找出如何获取字符串,解析它,并获得与解析后的键匹配的相应数组值。我不知道如何正确解释这个,所以这是一个例子。

$testArray = array(
    'router' => array(
        'format' => 'xml',
    ),
);

我要解析的字符串将如下所示 - router.format,我显然希望将xml作为字符串返回。传入的字符串可以具有任意数量的分隔周期。我想的是以某种方式进行递归,但我想不出任何可行的方法。

这与SF2的服务容器以及恢复服务的方式非常相似。

任何帮助都会很棒!

4 个答案:

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