2011-06-08 83 views
-1

我有一个多维数组的形式;整理多维数组值

Array 
(
    [0] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Bob Hope 
      [ITEM] => Holiday 
      [DURATION] => 04:00 
     ) 
    [1] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Bob Hope 
      [ITEM] => Work 
      [DURATION] => 05:00 
     ) 
    [2] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Bob Hope 
      [ITEM] => Holiday 
      [DURATION] => 06:00 
     ) 
    [3] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Bob Hope 
      [ITEM] => Work 
      [DURATION] => 05:00 
     ) 
    [4] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Joe Bloggs 
      [ITEM] => Holiday 
      [DURATION] => 02:00 
     ) 
    [5] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Joe Bloggs 
      [ITEM] => Work 
      [DURATION] => 03:00 
     ) 
    [6] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Joe Bloggs 
      [ITEM] => Holiday 
      [DURATION] => 03:00 
     ) 
    [7] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Joe Bloggs 
      [ITEM] => Work 
      [DURATION] => 02:00 
     ) 
) 

想整理结果,总结每个人的假期和工作,以便我可以输出一些东西的形式;

Array 
(
    [0] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Bob Hope 
      [ITEM] => Holiday 
      [DURATION] => 10:00 
     ) 
    [1] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Bob Hope 
      [ITEM] => Work 
      [DURATION] => 10:00 
     ) 
    [2] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Joe Bloggs 
      [ITEM] => Holiday 
      [DURATION] => 05:00 
     ) 
    [3] => Array 
     (
      [DATE] => 05-19-2011 
      [PERSON] => Joe Bloggs 
      [ITEM] => Work 
      [DURATION] => 05:00 
     ) 
) 

任何想法?任何和所有帮助表示赞赏。

+1

有什么区别? – jantimon 2011-06-08 08:22:56

+0

他将他们分组Bob Hope的假期合并,第二个例子的DURATION为10。 – tradyblix 2011-06-08 08:24:37

+0

@Ghommey [DURATION]加起来就是[ITEM]的唯一条目,而[NAME] – 2011-06-08 08:25:40

回答

1

好,很多的foreach的,但你基本上是添加在一个单独的结构中的值,并重新排列结果数组:

$items = array(
    0 => Array(
     'DATE' => '05-19-2011', 
     'PERSON' => 'Bob Hope', 
     'ITEM' => 'Holiday', 
     'DURATION' => '10:00', 
    ), 
    1 => Array(
      'DATE' => '05-19-2011', 
      'PERSON' => 'Bob Hope', 
      'ITEM' => 'Work', 
      'DURATION' => '10:00', 
    ), 
    2 => Array(
      'DATE' => '05-19-2011', 
      'PERSON' => 'Joe Bloggs', 
      'ITEM' => 'Holiday', 
      'DURATION' => '05:00', 
    ), 
    3 => Array(
      'DATE' => '05-19-2011', 
      'PERSON' => 'Joe Bloggs', 
      'ITEM' => 'Work', 
      'DURATION' => '05:00', 
    ), 
); 

foreach($items as $key=>$value){ 
    $item = $value['ITEM']; 
    $out[$value['PERSON']][$value['DATE']][$value['ITEM']] += $value['DURATION']; 
} 

foreach($out as $person=>$data){ 
    foreach($data as $date=>$items){ 
     foreach($items as $item=>$duration){ 
      $result[] = array(
       'PERSON'=>$person, 
       'DATE'=>$date, 
       'ITEM'=>$item, 
       'DURATION'=>$duration, 
      ); 
     } 
    } 
} 
print_r($result); 
0
  • 声明一个新的数组。
  • 遍历旧数组
  • 如果新的数组为空,当前数组元素添加进去
  • 如果没有,迭代新阵列
    • ,如果没有新的数组元素的电流匹配数组元素,添加它
    • 否则当前元素的期限增加了有关新的数组元素
2

在哪里数据来自哪里?一般情况下,这样的数据来自数据库,在这种情况下,下面的语句会做你想要什么:

SELECT 
    SUM(DURATION), 
    ITEM, 
    PERSON 
FROM 
    yourtable 
GROUP BY 
    PERSON, 
    ITEM; 

编辑:如果你想通过他们的项目组也一样,只是声明。

+0

我通常会同意你的意见,但这是我的问题的简化版本。我的问题是关于值的分组和集合。但正如你所说的是正确的,我已经投了答案。 – Rooneyl 2011-06-08 08:38:34

+0

谢谢。那么,如果它*来自数据库,那么你可以用SQL比用PHP更简单地做任何你想做的事情。 – 2011-06-08 09:01:19

+1

在这种情况下,我也会推荐使用SQL,因为在php中,事情会变得非常丑陋,这不仅仅是因为你必须解析持续时间到秒数来总结它们。如果你使用mysql,有一个函数用于这个顺便说一句:TIME_TO_SEC('00:00:00'),你可以总结它浆果显示。我相信你可以将TIME_TO_SEC的持续时间格式化,比在php中为此构建解决方案要容易得多。 – aurora 2011-06-08 09:12:09

0

如果你真的想用PHP我建议不解决这个嵌套太多循环。这是我的解决方案(它看起来相当丑陋btw。):

$result = array(); 
foreach ($data as $row) { 
    $key = $row['PERSON'] . '|' . $row['ITEM']; 
    $tmp = explode(':', $row['DURATION']); 
    $row['DURATION'] = $tmp[0] * 60 + $tmp[1]; 

    if (!isset($result[$key])) { 
     $result[$key] = $row; 
    } else { 
     $result[$key]['DURATION'] += $row['DURATION']; 
    } 
} 

$result = array_map(function($v) { 
    $v['DURATION'] = strftime('%M:%S', $v['DURATION']); 

    return $v; 
}, array_values($result));