2013-03-13 3 views
0

J'ai une fonction:Get JSON imbriquée/hiérarchique de gamme/PHP

function getROLES() { 
    $sql = " 
SELECT wur.role_id, wur.user_id, wu.first_name, wu.last_name 
FROM user_roles wur LEFT JOIN users wu ON wur.user_id = wu.user_id 
WHERE wur.role_id IN (100,101) 
    "; 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $roles = $stmt->fetchAll(PDO::FETCH_ASSOC); 
     $db = null; 
     echo json_encode($roles); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

la ouput de cette fonction est un tableau et JSON

Tableau:

Array ( 
    [0] => Array 
     ([role_id] => 100 [user_id] => 1 [first_name] => Al [last_name] => Pacino) 
    [1] => Array 
     ([role_id] => 100 [user_id] => 5 [first_name] => Brad [last_name] => Pitt) 
    [2] => Array 
     ([role_id] => 101 [user_id] => 12 [first_name] => Pierce [last_name] => Brosnan) 
    [3] => Array 
     ([role_id] => 101 [user_id] => 10 [first_name] => Johnny [last_name] => Deep) 
    [4] => Array 
     ([role_id] => 101 [user_id] => 11 [first_name] => Tom [last_name] => Hanks) 
) 1 

JSON:

[ 
    {"role_id":100,"user_id":1,"first_name":"Al","last_name":"Pacino"}, 
    {"role_id":100,"user_id":5,"first_name":"Brad","last_name":"Pitt"}, 
    {"role_id":101,"user_id":12,"first_name":"Pierce","last_name":"Brosnan"}, 
    {"role_id":101,"user_id":10,"first_name":"Johnny","last_name":"Deep"}, 
    {"role_id":101,"user_id":11,"first_name":"Tom","last_name":"Hanks"} 
] 

La question est: comment identifier le groupe de tous les utilisateurs appartient à chaque role_id. Comment convertir ou modifier le code pour avoir le ouput JSON comme ceci:

[ 
    {"role_id":100, "childrens": 
     [ 
      {"user_id":1,"first_name":"Al","last_name":"Pacino"}, 
      {"user_id":5,"first_name":"Brad","last_name":"Pitt"} 
     ], 
    {"role_id":101, "childrens":  
     [ 
      {"user_id":12,"first_name":"Pierce","last_name":"Brosnan"}, 
      {"user_id":10,"first_name":"Johnny","last_name":"Deep"}, 
      {"user_id":11,"first_name":"Tom","last_name":"Hanks"} 
     ] 
] 

Merci à l'avance de l'aide.

S'il vous plaît noter que im en utilisant Postgresql 9.1.8

Répondre

2

Eh bien la première chose que certains à l'esprit est jsut à boucle sur l'ensemble de données et de créer la structure souhaitée:

$jsonRoles = array(); 

foreach($roles as $role) { 
    $id = $role['role_id']; 
    if(!isset($jsonRoles[$id])) { 
     $jsonRoles[$id] = array(
      'role_id' => $id, 
      'childrens' => array() 
    ); 
    } 
    unset($role['role_id']); 
    $jsonRoles[$id]['childrens'][] = $role; 
} 

// then to get a regular array use array values: 
echo json_encode(array_values($jsonRoles)); 
+0

Vous me devança . – Barmar

+1

Bien que je le fasse avec une boucle appelant '$ stmt-> fetch()' plutôt que de créer deux structures de données. – Barmar

+0

Oui, ce serait plus approprié, mais j'ai supposé qu'il avait peut-être besoin du 'fetchAll' pour une autre raison non montrée. – prodigitalson