按字符串搜索多维数组

时间:2014-11-05 15:19:55

标签: php arrays

我有一个包含所有用户数据的多维数组,我已经构建了一个函数来获取给定键的数组值。

问题是数组是多维数组,我不知道有多少级别。

这是函数

function getUserSessionData($key)
{

            $arrKeys = explode('.', $key);
            if(count($arrKeys) == 1){
                if(isset($_SESSION['user_data'][$arrKeys[0]])){
                    return $_SESSION['user_data'][$arrKeys[0]];
                }
            }
            else{
                if(isset($_SESSION['user_data'][$arrKeys[0]][$arrKeys[1]])){
                    return $_SESSION['user_data'][$arrKeys[0]][$arrKeys[1]];
                }
            }
            return 0;
}

这就是电话会议的一个例子。

getUserSessionData('profile.firstName');

(。)表示数组的级别。 该功能仅支持两个级别..是否有任何方法可以增强此功能,因此它可以支持超过两个级别?

3 个答案:

答案 0 :(得分:2)

当然,使用循环结构:

function getUserSessionData($key) {
    $parts = explode('.', $key);
    $data = $_SESSION["user_data"];
    while (count($parts) > 0) {
        $part = array_shift($parts);
        $data = $data[$part];
    }
    return $data;
}

或独立于会话:

function resolveKey($array, $key) {
    $parts = explode('.', $key);
    while (count($parts) > 0) {
        $part = array_shift($parts);
        $array = $array[$part];
    }
    return $array;
}

echo resolveKey(array(
    "foo" => array(
        "bar" => array(
            "baz" => "ipsum"
        )
    )
), "foo.bar.baz"); // "ipsum"

echo resolveKey($_SESSION["user_data"], 'profile.firstName');

答案 1 :(得分:0)

这里是PHP-Fiddle

function getUserSessionData($key){
    $arrKeys = explode('.', $key);
    $data = $_SESSION['user_data'];
    foreach($arrKeys as $k){
        if(isset($data[$k])) $data = $data[$k];
        else return false;
    }
    return $data;
}

使用示例:

session_start(); 
$_SESSION['user_data'] = []; 
$_SESSION['user_data']['user'] = []; 
$_SESSION['user_data']['user']['name'] = []; 
$_SESSION['user_data']['user']['name']['first'] = "robert"; 

echo getUserSessionData("user.name.first"); // echos "robert"

答案 2 :(得分:0)

谢谢@Halcyon 你一直非常乐于助人。

但我已经修改了你的功能以使其发挥作用。 这是新功能

function getUserSessionData($key) {
$data = Yii::app()->session['account_data']['user_data'];
            $parts = explode('.', $key);
            while (count($parts) > 0) {
                $part = $parts[0];
                if(!isset($data[$part])){
                    return 0;
                }
                $data = $data[$part];
                array_shift($parts);
            }
            return $data;
}