代码之家  ›  专栏  ›  技术社区  ›  Shaun Hare

递归函数php

  •  2
  • Shaun Hare  · 技术社区  · 16 年前

    $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',
      ),
    )
    

    我需要它看起来像这样

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

    到目前为止,我已经传入了一个键数组,它形成了嵌套的数组键。

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

    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);
    }
    
    4 回复  |  直到 14 年前
        1
  •  0
  •   Wolph    16 年前

    一个粗糙但有效的解决方案。

    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')));     
    
        2
  •  3
  •   webbiedave    16 年前

    你不需要递归,只需要一个循环:

    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',
        ),
      ),
    )
    
    */
    
        3
  •  0
  •   Jeff Mattfield Jeff Mattfield    16 年前

    function add_role($dataArray, $userid, $project_code, $role)
    {
        $dataArray[$userid][$project_code][] = $role;
    }
    
        4
  •  0
  •   Artefacto    16 年前

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

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

    这将提供:

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