【问题标题】:Getting an average value from a multidim array in PHP从 PHP 中的 multidim 数组中获取平均值
【发布时间】:2021-08-30 16:55:59
【问题描述】:

我有一个包含子数组的数组,我试图总结一个特定的键/值对,以产生一个平均值。 它是这样的:

数据:

$producttypes = [
    [
        'id'   => 0,
        'name' => 'Product Type 1',
        'lot'  => [
            [
                'lotid'  => 0,
                'label'  => 'Lot 1',
                'sold'   => 1,
                'models' => [
                    [ 'modelid' => 0, 'cost' => 2000000, 'size' => 3400 ],
                    [ 'modelid' => 1, 'cost' => 2100000, 'size' => 3500 ],
                    [ 'modelid' => 3, 'cost' => 2200000, 'size' => 3600 ],
                ],
            ],
            [
                'lotid'  => 1,
                'label'  => 'Lot 2',
                'sold'   => 0,
                'models' => [
                    [ 'modelid' => 0, 'cost' => 2000000, 'size' => 3400 ],
                    [ 'modelid' => 1, 'cost' => 2100000, 'size' => 3500 ],
                    [ 'modelid' => 3, 'cost' => 2200000, 'size' => 3600 ],
                ],
            ],
            [
                'lotid'     => 2,
                'lot_label' => 'Lot 3',
                'sold'      => 1,
                'models'    => [
                    [ 'modelid' => 0, 'cost' => 2000000, 'size' => 3400 ],
                    [ 'modelid' => 1, 'cost' => 2100000, 'size' => 3500 ],
                    [ 'modelid' => 3, 'cost' => 2200000, 'size' => 3600 ],
                ],
            ],
        ],
    ],
];

我可以拥有任意数量的产品类型、这些产品类型中的批次以及这些批次中的模型。模型可以在不同批次中重复,但批次不能在不同产品类型中重复。

我需要能够获得已售出或未售出的任何批次的平均价格和尺寸。

我试着做一个递归函数,但我很烂。我能够深入到我需要的级别,以满足条件(如果已售出 = true 或 false),但我找不到从同一个数组中提取成本或大小的方法。

function getAvgByKey_r($arr, $find, $col, $cond, &$count=0, &$sum=0)
{

    foreach($arr as $key=>$value) {
        if(is_array($arr[$key])) {
            getAvgByKey_r($arr[$key], $find, $col, $cond, $count, $sum);
        } else {
            if($key == $col) {      
                if($value == $cond) {
                    /*insert magic space wizard code here*/
                }
            }
        }
    }
    
    if($count > 0) {
        return $sum / $count;
    } else {
        return 0;
    }
}

$arr 是主数组,$find 是我想要平均的字段(即大小或成本),$col 是我要检查的键(即已售出),$cond 是值我正在检查(1/0)。我认为需要 &$count=0 和 &$sum=0 才能进入递归函数的下一次迭代。

这是我们最绝望的时刻。帮助我欧比旺克诺比。你是我唯一的希望。

【问题讨论】:

  • 你了解通过引用传递函数参数的作用吗?使用您提供的示例数据,您如何调用此 getAvgByKey_r 函数以及您期望的输出?
  • 你做的比它需要的要困难得多。你不需要递归函数,你只需要嵌套循环。
  • 我会在页面其他地方的循环中调用 getAvgByKey_r,可能在循环中。示例数据是一个非常精简的原始数据,但基本上我会这样调用函数: getAvgByKey_r($producttypes, 'cost', 'sold', 1) 我想从所有售出的批次中获得平均“成本” .也许我不需要引用参数,我只是使用在其他地方找到的递归函数。
  • 我同意我可以通过嵌套循环来简化这一点,但我想在其他数组上使用这个函数,不是所有数组都使用相同的结构,而是具有相同的 key=>val 对。最后我可能只做多个简单的功能,而不是一个复杂的通用功能。

标签: php recursion multidimensional-array


【解决方案1】:

由于我似乎无法找到一种方法来跟踪父数组中的索引,因此我似乎无法从具有条件的 multidim 数组中提取平均值。唯一的方法是按照 Don R 的建议,并使用嵌套循环。

这是我的解决方案:

function getAvg_r( $arr, $key, $col=NULL, $cond=NULL )
{
    $total=0;
    $count=0;
    foreach((array)$arr as $producttype_row=>$producttype_value)
    {
        if( is_array($producttype_value) )
        {
            if( array_key_exists( 'lots', $producttype_value ) )
            {
                foreach($producttype_value['lots'] as $lots_row=>$lots_value)
                {
                    if( array_key_exists( 'models', $lots_value ) )
                    {
                        foreach( $lots_value['models'] as $models_row=>$models_value)
                        {
                            // what we've been searching for!
                            if( array_key_exists( $key, $models_value ) )
                            {
                                if($col !=NULL)
                                {
                                    if($lots_value[$col] == $cond)
                                    {
                                        $total += $models_value[$key];
                                        $count ++;
                                    }
                                }
                                else
                                {
                                    $total += $models_value[$key];
                                    $count ++;
                                }
                            }
                        }
                    }
                }
            }
        }

    }
    return $total / $count;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2016-07-08
    • 2013-02-28
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多