说我有以下内容:
$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_id
和role_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
)
)
答案 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, ...),
)