鍍金池/ 問答/PHP/ 如何高效把'x.y.z'解析為$data['x']['y']['z']?

如何高效把'x.y.z'解析為$data['x']['y']['z']?

目前我使用的方式如下

function parse($str, &$data)
{
    $fields= explode('.', $str);
    $tmpData = $data;
    while ($field = array_shift($fields)) {
        if (isset($tmpData [$field])) {
            $tmpData = $tmpData [$field];
        } else {
            return null;
        }
    }
    return $tmpData;
}

但是假如$data是個(gè)比較大的數(shù)組,有1000+的key,我這種寫法不能使用引用,因?yàn)闀?huì)修改原數(shù)組,不知道大家有沒有比較好的解析方法?(最好不要使用eval類方法)

回答
編輯回答
任她鬧

首先說明一下你的標(biāo)題和函數(shù)功能不符,應(yīng)該是:

如何高效把order.user.name解析為$data['order']['user']['name']


下面的代碼較為惡心,看看就好,謹(jǐn)慎使用,謹(jǐn)慎使用,謹(jǐn)慎使用

/**
 * @param $str
 * @param $data
 * @return null|mixed
 * @throws Exception
 */
function parse($str, &$data)
{
    $str = trim($str);
    if (empty($str)) {
        throw new \Exception("str is empty");
    }
    $fields= explode('.', $str);
    switch (count($fields)) {
        case 1:
            return $data[$fields[0]] ?? null;
        case 2:
            return $data[$fields[0]][$fields[1]] ?? null;
        case 3:
            return $data[$fields[0]][$fields[1]][$fields[2]] ?? null;
        case 4:
            return $data[$fields[0]][$fields[1]][$fields[2]][$fields[3]] ?? null;
        case 5:
            return $data[$fields[0]][$fields[1]][$fields[2]][$fields[3]][$fields[4]] ?? null;
        case 6:
            return $data[$fields[0]][$fields[1]][$fields[2]][$fields[3]][$fields[4]][$fields[5]] ?? null;
        default;
            // 大仙你的數(shù)組超過6級(jí)了,是不是考慮優(yōu)化一下代碼 ^_^
            throw new \Exception("str key too long");
    }
}
2018年5月8日 07:06