【发布时间】:2018-04-21 12:42:48
【问题描述】:
考虑下面的这个集合:
$collection = Array (
$arr1 = Array ( 1 => 10.0, 2 => 20.0, 3 => 50.0, 4 => 80.0, 5 => 100.0 ),
$arr2 = Array ( 3 => 20.0, 5 => 20.0, 6 => 100.0, 7 => 10.0 ),
$arr3 = Array ( 1 => 30.0, 3 => 30.0, 5 => 10.0, 8 => 10.0 )
);
考虑这个基于包含在 $collection 中的数组的交集的理论输出,考虑到它们的数组键具有基于单个值的平均值的各自值:
$output = Array ( 3 => 33.3333, 5 => 43.3333 );
这个问题可以用像 array_intersect_* 这样的原生 PHP 函数以优雅的方式解决吗?
如果没有,你能建议我一个优雅的解决方案,不一定需要外部丑陋的 foreach 吗?
请记住,需要相交的数组数量不是固定的。它可以是 2 个输入数组,因为它可以是 1000 个输入数组。 键始终为整数,值始终为浮点数或整数。
换句话说:
$collection = [
$arr1 = [ ... ];
$arr2 = [ ... ];
$arr3 = [ ... ];
...
$arrn = [ ... ];
];
$output = [ intersected and weighted array based (on comparison) on keys from $arr1 to $arrn, and (on values) from the value averages ];
【问题讨论】:
-
为什么这需要“未知数量的嵌套foreach”,每个数组都是非常一维的......?
-
等等...什么?未知数量的数组?这是怎么发生的?
-
并非如此。 未知数量的数组。但是这可能会发生......数组通常不只是“发生”。
-
这些数组是从哪里来的呢?您至少可以将 them 放入一个数组开始,以便您可以轻松地循环它们吗? (因为输入数组的数量未知,您可能宁愿回到 foreach 循环,将其输入 array_merge_recursive 可能会更困难。)否则,您将不得不使用可变变量循环处理“编号”数组名字,简直丑陋。
-
您的示例输出仍然与输入不匹配,键
1出现两次,因此结果中也应该有 20 个平均值。 (对于仍然要求在现有解决方案下“美化一点”的人,你的要求相当草率...... ;-)
标签: php arrays average array-intersect