2016-06-20 28 views
0

我有一个这样的数组:如何使用内部数组的特定键对多维数组进行分组?

$my_array = array(
    array(
     array('cnt' => 1, 'date' => '2016-06-18', 'name' => 'Phone Calls'), 
     array('cnt' => 1,'date' => '2016-06-18','name' => 'Others Works') 
    ), 
    array(
     array('cnt' => 2 , 'date' => '2016-06-17', 'name' => 'Phone Calls'), 
     array('cnt' => 1, 'date' => '2016-06-17', 'name' => 'Others Works') 
    ) 
); 

,我需要转换成下面的格式来完成我的特定目的。

$desired_result = array(
    array('name' => 'Phone Calls', 'dateDetail' => array(
     array('cnt' => 1, 'date' => '2016-06-18'), 
     array('cnt' => 2, 'date' => '2016-06-17'), 
    )), 
    array('name' => 'Others Works', 'dateDetail' => array(
     array('cnt' => 1, 'date' => '2016-06-18'), 
     array('cnt' => 1, 'date' => '2016-06-17'),   
    )) 
); 

我需要将我的数组按名称与所有日期和计数数据在一起。有人可以帮我格式化这个数组吗?

+0

我需要绘制d3chart,我需要我的数组转换format.What我想尝试的http://jsfiddle.net/JYS8n/1/ –

+0

都能跟得上我没有得到任何error.First阵列数组我现在有什么需要将数组格式转换为我的图表 –

回答

2

您可以通过弹出每个最低级别数组的名称并将其用作重组数组的较高级别密钥来按名称进行分组。

foreach ($your_array as $day) { 
    foreach ($day as $item) { 
     $name = array_pop($item);     // removes the 'name' key and returns it 
     $converted[$name]['name'] = $name; 
     $converted[$name]['dateDetail'][] = $item; 
    } 
} 

$result = array_values($converted);    // convert from string keys to numeric 

array_pop只发生于工作,因为name是在项目阵列中的最后一个键。如果不是,则需要指定要删除和使用这样哪个键:

$name = $item['name']; 
unset($item['name']); 

要通过datedateDetail阵列每个name中添加分组,这个想法是一样的,当按名称分组。使用date作为dateDetail中的键,并将其添加到cnt键以获取重复的日期值。

foreach ($your_array as $day) { 
    foreach ($day as $item) { 
     $name = array_pop($item); 
     $new[$name]['name'] = $name; 

     // check if the date is already set 
     if (isset($new[$name]['dateDetail'][$item['date']])) { 
      // if so, add the count of the current item 
      $new[$name]['dateDetail'][$item['date']]['cnt'] += $item['cnt']; 
     } else { 
      // if not, set it. 
      $new[$name]['dateDetail'][$item['date']] = $item; 
     } 
    } 
} 

// remove the date string keys 
foreach ($new as &$name) { 
    $name['dateDetail'] = array_values($name['dateDetail']); 
} 
unset($name); // unset the reference 

// remove the name string keys 
$result = array_values($new); 
+0

感谢您的回复。我有一个关键名字的数组。但我需要添加具有相同日期的cnt键值。请给我解释一下我该怎么做? –

+0

原则与按名称分组相同。使用日期作为'dateDetail'内的附加关键字,并为每个具有匹配日期的项目增加它。 –

+0

@MadAdh我用一个例子更新了答案,以显示我的意思。 –

相关问题