【问题标题】:Recusrive function to calculate scores计算分数的递归函数
【发布时间】:2022-11-25 21:57:04
【问题描述】:

我有一个数组如下:

$array = [
    [
        'result' => null, 
        'weight' => 50, 
        'children' => [
            ['result' => 5, 'weight' => 50, 'children' => []],
            ['result' => 5, 'weight' => 50, 'children' => []]
        ]
    ],
    [
        'result' => 3, 
        'weight' => 50, 
        'children' => []
    ],
];

我想要实现的是运行一个函数,例如:

function calculateScores(&$array)
{

}

calculateScores($array);

得到想要的结果:

$array = [
    [
        'result' => 5, 
        'weight' => 50, 
        'children' => [
            ['result' => 5, 'weight' => 50, 'children' => []],
            ['result' => 5, 'weight' => 50, 'children' => []]
        ]
    ],
    [
        'result' => 3, 
        'weight' => 50, 
        'children' => []
    ],
];

所以基本上,有孩子的条目通过将孩子的结果和权重相乘来计算他的分数。在给定的示例中,这将是:50% *5 + 50% + 5。

所以,基本上。如果一个条目有孩子,它的分数必须通过将结果乘以这些孩子各自的权重来计算。

由于 $array 可以有多个级别,递归函数可以完成这项工作。

但是,我很难想出一个方法。我尝试了几个想法但没有成功。

【问题讨论】:

  • 你可以发布你的尝试吗?
  • 嗨,我尝试了一个带有一些 if 语句的循环,但每件事或多或少都会导致计算器溢出。从来没有真正需要使用引用编写递归函数(我想这一定是方法)。很难过这个。
  • AKA result 是如何计算分数的
  • 结果来自一个单独的函数(为简单起见,我将其缩短)。在给定的计算条目分数的示例中,相应的孩子将乘以他们的权重和结果,对于给定的示例,这将是 50% * 5 + 50% * 5。
  • 找到了一种按预期工作的解决方案。如果您有进一步的想法,请随时发表评论。

标签: php recursion


【解决方案1】:

最初的示例稍作调整(将数组转换为对象),事实证明,它非常简单。

我可能太尊重了,因为我们正在处理递归。

可能会帮助任何人(或给出解决方法的想法......)。

<?php
// Enter your code here, enjoy!

$array = [
    (object) [
        'result' => null, 
        'weight' => 50, 
        'children' => [
            (object) [
                'result' => null, 
                'weight' => 50, 
                'children' => [
                    (object) [
                        'result' => 5,
                        'weight' => 75,
                        'children' => []
                     ],
                    (object) [
                        'result' => 4,
                        'weight' => 25,
                        'children' => []
                     ]
                 ]
            ],
            (object) [
                'result' => 5, 
                'weight' => 50, 
                'children' => []
            ]
        ]
    ],
    (object) [
        'result' => 3, 
        'weight' => 50, 
        'children' => []
    ],
];


function calculateScores($array, $last = null)
{
    foreach ($array as $a) {
        if (count($a->children) > 0) {
            $result = calculateScores($a->children, $a);
            if ($result) {
                $a->result = $result;
            }
        }
    }
    
    if (!is_null($last)) {
        $result = 0;
        foreach ($array as $a) {
            $result += $a->result * ($a->weight / 100);
        }
        return $result;
    }
}

calculateScores($array);

var_dump($array);

//var_dump($last);
//var_dump($array);

对于立即否决我的问题的那个人:谢谢伙计,你是一个真正的英雄。

【讨论】:

  • 这对你来说是一个好的解决方案吗?因为如果它有效,为什么不呢。
  • 嗯,不确定它是否好,:-) 它至少做了我想要的。在查看纯数组时,我有点把整个事情搞砸了,因为这样通过引用传递/分配就成了一个大问题。我在具有多个函数的基类中使用该函数来计算相应的结果。因此,我首先计算没有子项和子项的所有结果,现在我可以运行该函数来获取所有结果。稍微重构(不完美,但我相信比以前更好)。
猜你喜欢
  • 2015-07-28
  • 2014-06-08
  • 1970-01-01
  • 2013-11-26
  • 2021-05-03
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多