我有一个如下所示的数组:
Array
(
[0] => Array
(
[amount] => 75.00
[name] => CLIENT1
[week] => 22
)
[1] => Array
(
[amount] => 945.00
[name] => CLIENT1
[week] => 23
)
[2] => Array
(
[amount] => 45.00
[name] => CLIENT1
[week] => 24
)
...
[15] => Array
(
[amount] => 45.00
[name] => CLIENTX
[week] => 22
)
[16] => Array
(
[amount] => 15.00
[name] => CLIENTX
[week] => 22
)
// HAS NO VALUE IN WEEK 23 BUT TWO IN WEEK 22!!!
[17] => Array
(
[amount] => 73.00
[name] => CLIENTX
[week] => 24
)
我需要一个看起来像这样的数组
Array
(
['weeks'] => Array (22,23,24) //ALL WEEKS FOUND SOMEWHERE
['series'] => Array
(
[0] => Array
(
['name'] => 'CLIENT1'
['data'] => Array (75.00, 945.00, 45.00)
)
[1] => Array
(
['name'] => 'CLIENTX'
['data'] => Array (60.00, 0, 73.00)
)
)
)
首先尝试
这是一个相当合乎逻辑的问题,不是编程问题,但我现在很难看到它。
['weeks'] => Array (22,23,24)
应该不是问题,但其余的确实是。
我到目前为止最接近的是:
$clientArray = array();
$weekAmount = array();
foreach($hours as $hour){
/* For better readability */
$client = $hour['name'];
$amount = $hour['amount'];
$week = $hour['week'];
if(!array_key_exists($week, $weekAmount)){
$weekAmount[$week] = 0;
}
$weekAmount[$week] = $amount;
$clientArray[$client] = $weekAmount;
ksort($clientArray[$client]); // to order by weeks
}
但是这并没有在同一周累加值,我需要再次循环这个,我不知道如何找到“缺失”周并将0
设置为相应值。
我希望我能清楚地解释自己,如果不是我再试一次。
答案 0 :(得分:1)
必须有一种比这更有效的方法,但至少它有效:
<?php
$input = array(
array('amount' => 75.00,
'name' => 'CLIENT1',
'week' => 22),
array('amount' => 945.00,
'name' => 'CLIENT1',
'week' => 23),
array('amount' => 45.00,
'name' => 'CLIENT1',
'week' => 24),
array('amount' => 45.00,
'name' => 'CLIENTX',
'week' => 22),
array('amount' => 15.00,
'name' => 'CLIENTX',
'week' => 22),
array('amount' => 73.00,
'name' => 'CLIENTX',
'week' => 24),
);
$weeks = array();
$names = array();
foreach ($input as $v) {
if (!isset($weeks[$v['week']]))
$weeks[$v['week']] = array();
if (!isset($names[$v['name']]))
$names[$v['name']] = array();
if (!isset($names[$v['name']][$v['week']]))
$names[$v['name']][$v['week']] = 0;
$names[$v['name']][$v['week']] += $v['amount'];
}
$output = array('weeks' => array(), 'series' => array());
foreach ($weeks as $week=>$values) {
$output['weeks'][] = $week;
}
foreach ($names as $name=>$data) {
$serie = array();
$serie['name'] = $name;
foreach ($weeks as $week=>$values) {
if (isset($data[$week]))
$serie['data'][] = $data[$week];
else
$serie['data'][] = 0;
}
$output['series'][] = $serie;
}
echo '<pre>'; print_r($output);
?>
返回:
Array
(
[weeks] => Array
(
[0] => 22
[1] => 23
[2] => 24
)
[series] => Array
(
[0] => Array
(
[name] => CLIENT1
[data] => Array
(
[0] => 75
[1] => 945
[2] => 45
)
)
[1] => Array
(
[name] => CLIENTX
[data] => Array
(
[0] => 60
[1] => 0
[2] => 73
)
)
)
)