【发布时间】: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