2010-08-17 7 views
2

j'ai un tableau qui ressemble à cefonction récursive php

$dataArray = array (
    0 => 
    array (
    'UserId' => '804023', 
    'ProjectCode' => 'RA1234', 
    'Role' => 'PI', 
), 
    1 => 
    array (
    'UserId' => '804023', 
    'ProjectCode' => 'RA1234', 
    'Role' => 'PM', 
), 
    2 => 
    array (
    'UserId' => '804023', 
    'ProjectCode' => 'A90123', 
    'Role' => 'CI', 
), 
    3 => 
    array (
    'UserId' => '804023', 
    'ProjectCode' => 'A20022', 
    'Role' => 'PM', 
), 
) 

j'ai besoin de ressembler à ce

$expected = array (
    804023 => 
    array (
    'RA1234' => 
    array (
     0 => 'PI', 
     1 => 'PM', 
    ), 
    'A90123' => 
    array (
     0 => 'PI', 
    ), 
    'A20022' => 
    array (
     0 => 'CI', 
    ), 
), 
) 

Je pense que cela pourrait être réalisé génériquement en utilisant récursion comme cela est un scénario I Je suis susceptible de rencontrer de nombreuses fois

Je l'ai obtenu ce loin en passant dans un tableau de clés qui forment les clés de tableau imbriquées, par exemple

$keys=array("UserId","projectCode","Role"); 

mais je ne vois tout simplement pas où aller à partir de là des pointeurs?

public function structureData(array $data, array $keys) 
{ 
    //$structuredData = array(); 


    foreach ($data as $key => $value) 
    { 
    $keyForData = array_slice($keys,0,1); 


    $remainingKeys = $keys; 
    array_shift($remainingKeys); 

    if (!array_key_exists($value[$keyForData[0]], $structuredData)) 
    { 

    $count=count($remainingKeys); 


    $structuredData[$value[$keyForData[0]]] =array(); 
    // this returns as expected array(804023 =>array()); but subsequent recursive calls with the remaining data fail 



    } 

    } 
    return $structuredData); 
} 
+0

cela ne semble pas avoir à voir avec la récursivité. essayer une approche différente? – muhmuhten

Répondre

0

Un brut, mais la solution qui fonctionne.

function structureData($data, $keys){           
    $out = array();                
    foreach($data as $row){              
     $subout = &$out;               
     foreach(array_slice($keys, 0, -1) as $key){        
      $value = $row[$key];             
      $subout = &$subout[$value];           
     }                  
     $subout[] = $row[$keys[count($keys) - 1]];        

    }                   
    return $out;                 
}                    

print_r(structureData($dataArray, array('UserId', 'ProjectCode', 'Role')));  
+0

A travaillé un régal pour notre scénario merci –

3

Vous n'avez pas besoin récursion, juste une boucle:

foreach ($dataArray as $da) { 
    $expected[$da['UserId']][$da['ProjectCode']][] = $da['Role']; 
} 

var_export($expected); 

/* output: 

array (
    804023 => 
    array (
    'RA1234' => 
    array (
     0 => 'PI', 
     1 => 'PM', 
    ), 
    'A90123' => 
    array (
     0 => 'CI', 
    ), 
    'A20022' => 
    array (
     0 => 'PM', 
    ), 
), 
) 

*/ 
+0

Ce n'est pas tout ce dont il a besoin, mais c'est la bonne idée. – Borealid

+0

merci, j'ai juste besoin de généraliser maintenant –

+0

Il devrait être tout ce qu'il faut pour le faire aller dans la bonne direction. – webbiedave

0

Recursion? Nah. Essayez ceci:

function add_role($dataArray, $userid, $project_code, $role) 
{ 
    $dataArray[$userid][$project_code][] = $role; 
} 
0

solution fonctionnelle:

$t = array_gather_key($dataArray, function ($e) { return $e['UserId']; }); 

$t = array_map(
    function ($e) { 
     return array_gather_key($e, 
      function ($e) { return $e['ProjectCode']; }, 
      function ($e) { return $e['Role']; }); 
    }, 
    $t 
); 

Cette fonction d'ordre supérieur:

function array_gather_key($array, $func, $transf = null) { 
    $res = array(); 
    foreach ($array as $elem) { 
     $key = $func($elem); 
     if (!array_key_exists($key, $res)) 
      $res[$key] = array(); 
     if ($transf === null) 
      $res[$key][] = $elem; 
     else 
      $res[$key][] = $transf($elem); 
    } 
    return $res; 
} 

Cela donne:

 
array(1) { 
    [804023]=> 
    array(3) { 
    ["RA1234"]=> 
    array(2) { 
     [0]=> 
     string(2) "PI" 
     [1]=> 
     string(2) "PM" 
    } 
    ["A90123"]=> 
    array(1) { 
     [0]=> 
     string(2) "CI" 
    } 
    ["A20022"]=> 
    array(1) { 
     [0]=> 
     string(2) "PM" 
    } 
    } 
}