在php foreach中重新排序数组

时间:2016-07-22 12:53:41

标签: php arrays

我有一个如下所示的数组:

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设置为相应值。

我希望我能清楚地解释自己,如果不是我再试一次。

1 个答案:

答案 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
                        )    
                )    
        )    
)