2010-04-14 7 views
0

Dire que je donne les résultats suivants:Retour alias de colonne comme tableau associatif clé

$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); 

Ensuite, si je print_r ($ user) Je reçois:

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

Je voudrais nettoyer ce tableau un bit en utilisant des alias pour mes noms de colonnes dans la requête de sélection. Je peux remplacer user_id avec id assez facilement mais je voudrais également choisir des alias pour role_id et role_name tels qu'ils soient retournés comme role => array (id => 1, name => admin).

Par exemple, j'ai essayé ce qui suit (ce qui ne fonctionne pas):

$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 
    "; 

Le tableau que je voudrais que cela revenir ressemblerait à ceci:

Array(
    [id] => 1 
    [email] => [email protected] 
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99 
    [role] => Array(
     [id] => 1 
     [name] => admin 
     ) 
    ) 

Répondre

1

La méthode mysql_fetch_assoc norme ne le fera pas pour vous: vous devrez faire un peu de vous-même post-production.

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; 
    } 
} 

Cela ne fonctionne que (si cela fonctionne du tout - non testé) avec un seul niveau d'indentation (qui est, foo[bar][baz] ne seront pas traitées).

0

Vous ne pouvez pas faites ceci avec mysql_fetch_assoc() seul.

Si vous avez vraiment besoin d'un tableau multidimensionnel, vous devez le faire manuellement. Créez éventuellement une fonction d'assistance qui boucle sur un enregistrement récupéré et consolide plusieurs clés avec le même préfixe (dans votre cas, "role_").

De nombreuses bibliothèques de bases de données existantes feront ce travail pour vous. Par exemple, l'aide de la base de données de CakePHP retournerait un tableau comme

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