2010-04-14 61 views
0

說我有以下幾點:返回列別名作爲關聯數組鍵

$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($用戶),我得到:

Array(
    [user_id] => 1 
    [email] => [email protected] 
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99 
    [role_id] => 1 
    [role_name] => admin 
    ) 

我想清理這個數組了通過在select查詢中爲我的列名使用別名。我可以很容易地用id替換user_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] => [email protected] 
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99 
    [role] => Array(
     [id] => 1 
     [name] => admin 
     ) 
    ) 

回答

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]不會被處理)。

0

你不能使用mysql_fetch_assoc()單獨執行此操作。

如果你真的需要一個多維數組,你必須手動完成。 可能創建一個幫助函數,它遍歷一個檢索到的記錄,併合並具有相同前綴的多個鍵(在你的情況下,「role_」)。

許多現有的數據庫庫將爲您完成這項工作。例如,CakePHP的數據庫幫助將返回類似

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