将列别名作为关联数组键返回

时间:2010-04-14 00:12:51

标签: php mysql

说我有以下内容:

$query = "
    SELECT user_id,email,password, roles.role_id,role_name
    FROM users
    JOIN roles USING(role_id)
    LIMIT 1
    ";
$result = mysql_query($query);
$user = mysql_fetch_assoc($result);

然后如果我print_r($ user)我得到:

Array(
    [user_id] => 1 
    [email] => example@example.com
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99
    [role_id] => 1 
    [role_name] => admin 
    )

我想通过在select查询中为列名使用别名来清理这个数组。我可以轻松地将user_id替换为id,但我还想为role_idrole_name选择别名,以便将它们作为role => array (id => 1, name => admin)返回。

例如,我尝试了以下(不起作用):

$query = "
    SELECT user_id AS id,email,password, roles.role_id AS role[id],role_name AS role[name]
    FROM users
    JOIN roles USING(role_id)
    LIMIT 1
    ";

我想要返回的数组看起来像:

Array(
    [id] => 1 
    [email] => example@example.com
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99
    [role] => Array(
        [id] => 1
        [name] => admin
        )
    )

2 个答案:

答案 0 :(得分:1)

标准mysql_fetch_assoc方法不适合您:您必须自己进行一些后期制作。

function my_assoc($result) {
    $row = mysql_fetch_assoc($result);
    if (is_array($row)) {
        $out = array();
        foreach ($row as $field => $value) {
            if (preg_match('/^([^\]]+)\[([^\]]+)\]$/', $field, $matches) {
                $out[$matches[1]][$matches[2]] = $value;
            } else {
                $out[$field] = $value;
            }
        }
        return $out;
    } else {
        return $row;
    }
}

这仅适用于(如果它可以工作 - 未经测试),只有一个级别的缩进(即,foo[bar][baz]将不会被处理)。

答案 1 :(得分:0)

单独使用mysql_fetch_assoc()不能这样做。

如果你真的需要一个多维数组,你必须手动完成。 可能会创建一个循环检索记录的辅助函数,并使用相同的前缀合并多个键(在您的情况下,“role _”)。

许多现有的数据库库将为您完成此工作。例如,CakePHP的数据库助手将返回一个类似

的数组
Array(
 [User] => array('id' => 1, 'email' => '...'),
 [Role] => array('id' => 1, ...), 
)