隔离唯一值与2D数组的列,并将其他列分组为子阵列

问题描述 投票:0回答:2
我需要一个看起来像这样的数组

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

设置为基于值。

    

必须有比这更有效的方法,但至少它有效:

<?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
                        )    
                )    
        )    
)

php arrays multidimensional-array grouping sub-array
2个回答
1
投票
试图减少环路并直接生成嵌套结果结构而无需后循环修复,您会发现参考文献用于填充相应组中的索引子阵列。

首次遇到名称时,仅将新行推入结果数组。

当第一次遇到一周的一周时,必须将新列添加到所有数据子阵列中 - 默认值零为零。

demo

0
投票

$result = []; foreach ($array as $row) { extract($row); if (!isset($seriesRefs[$name]['name'])) { $result['weeks'] ??= []; $seriesRefs[$name]['name'] = $name; $result['series'][] =& $seriesRefs[$name]; } if (!isset($weekRefs[$name][$week])) { $result['weeks'][] = $week; $allNames ??= array_column($array, 'name', 'name'); foreach ($allNames as $n) { $weekRefs[$n][$week] = 0; $seriesRefs[$n]['name'] ??= null; $seriesRefs[$n]['data'][] =& $weekRefs[$n][$week]; } } $weekRefs[$name][$week] += $amount; } var_export($result);

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.