从PHP中的多维数组中获取平均值



我有一个带有子数组的数组,我正在尝试将特定的key/val对相加,以产生平均值。它是这样的:

数据:

$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 ],
],
],
],
],
];

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

我需要能够得到任何已售出或未售出的地块的平均价格和大小。

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

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,我认为需要进行递归函数的下一次迭代。

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

由于我似乎找不到从父数组跟踪索引的方法,所以我似乎无法从有条件的多维数组中提取平均值。唯一的方法是按照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;
}

最新更新