Multiarray, который нужно преобразовать с помощью некоторых бизнес-правил, которые суммируются, уникальны, добавляются в PHP - PullRequest
1 голос
/ 03 мая 2019

У меня есть мульти-массив, который необходимо преобразовать в соответствии с желаемым результатом с помощью некоторых бизнес-правил, которые суммируют, уникальны, добавляют.Мне нужна ваша поддержка, чтобы решить эту проблему.

Определенно приветствуется помощь

$arr = array (
    'AMXB 5321'  => array(
    array("course_title_code" => "AMB 5321",
          "content" => "Course",
          "total" => "303",
          "count" => "85",
          "ranking" => array(array(1,2,3,4,5),array(1,2,3,4,5)),
          "frequency" => array(array(2,3,9,13,17),array(6,3,13,14,5))),
    array("course_title_code" => "AMB 5321",
          "content" => "Succeed in the course",
          "total" => "300",
          "count" => "85",
          "ranking" => array(array(5),array(3,4,5)),
          "frequency" => array(array(1),array(3,3,9))
         ),
    array("course_title_code" => "AMB 5321",
          "content" => "conduct of the course",
          "total" => "304",
          "count" => "85",
          "ranking" => array(array(5),array(1,2,3,4,5)),
          "frequency" => array(array(1),array(1,1,2,3,8))
         )
));
echo "<pre>";
print_r($arr);

Желаемый результат

Array
(
    [AMXB 5321] => Array
        (
            [0] => Array
                (
                    [course_title_code] => AMB 5321
                    [content] => Course
                    [total] => 303
                    [count] => 85
                    [ranking] => 1,2,3,4,5
                    [frequency] => 8,6,22,27,22
                )

            [1] => Array
                (
                    [course_title_code] => AMB 5321
                    [content] => Succeed in the course
                    [total] => 300
                    [count] => 85
                    [ranking] => 1,2,3,4,5
                    [frequency] => 0,0,3,3,10
                )

            [2] => Array
                (
                    [course_title_code] => AMB 5321
                    [content] => conduct of the course
                    [total] => 304
                    [count] => 85
                    [ranking] => 1,2,3,4,5
                    [frequency] => 1,1,2,3,9
                )

        )

)

Прикрепленный снимок более уточнить состояние моего требования

enter image description here

Ответы [ 2 ]

1 голос
/ 03 мая 2019

При анализе вашей проблемы и модульности, как показано ниже,

$count = 5; // at your will change it
array_walk($arr, function($item, $key) use(&$result, $count){
    foreach($item as $k => $v){
        // ... its splat operator which merge child arrays
        $temp = array_unique(array_merge(array_merge(...$v['ranking']),range(1,$count)));
        // sort as we need 1,2,3,4,5 or upto $count
        sort($temp);
        $result[$key][$k] = $v; // assigning all other values to result
        $result[$key][$k]['ranking'] = implode(",",$temp);
        foreach($v['frequency'] as &$v1){
            $v1 = array_pad($v1, -$count,0); // padding from left to right with zeros
        }
        // splat operator https://www.php.net/manual/en/migration56.new-features.php
        $result[$key][$k]['frequency'] = implode(",",array_map(function (...$arrs) {return array_sum($arrs);}, ...$v['frequency']));
    }
});

Демо .

1 голос
/ 03 мая 2019

Вы можете подойти к этому, используя array_walk

array_walk($arr, function(&$v,$k){
    foreach($v as $key => &$s){
        $s['ranking'] = implode(',',range(1,5));
        foreach($s['frequency'] as $key => &$value){
            $temp   = $value;
            $value = (count($value) == 5) ? $value : array_merge(array_fill(0, 5 - count($value), 0), $temp);
            if($key == 1){
                for($i=0;$i<count($value);$i++){
                    $value[$i] += $s['frequency'][$key-1][$i];
                } 
                $temFormat = implode(',',$s['frequency'][1]);
            } 
        }
        unset($s['frequency']); 
        $s['frequency'] = $temFormat;
    }
});
...