递归函数php

时间:2010-08-17 16:22:13

标签: php arrays multidimensional-array

我有一个看起来像这样的数组

$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 个答案:

答案 0 :(得分:3)

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

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

*/

答案 1 :(得分:0)

递归?罗。试试这个:

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

答案 2 :(得分:0)

功能解决方案:

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

答案 3 :(得分:0)

原始但有效的解决方案。

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