我有一个四级多维数组,我需要对数值“leaves”按升序(ASC)排序,以便计算值的中值。
我尝试了array_walk_recursive()
、array_multisort()
、usort()
等,但无法找到有效的解决方案。
以下是阵列的示意图:
(
[2017-05-01] => Array
(
[DC] => Array
(
[IT] => Array
(
[0] => 90
[1] => 0
)
[DE] => Array
(
[0] => 18
[1] => 315
[2] => 40
[3] =>
[4] => 69
)
[Other] => Array
(
[0] => 107
[1] => 46
[2] =>
[3] =>
[4] => 27
[5] => 22
)
)
)
)
2条答案
按热度按时间nszi6y051#
这将使用输入数组的结构输出最深子数组的中值。
如果中值是空字符串,我将把中值(一个子集中的一个或两个)硬转换为整数,我还假设如果子集是空的,您将希望
0
作为输出。代码:(Demo)
输出:
$count & 1
是一个逐位比较,它确定值是否为奇数而不执行算术(并且是在PHP中执行此检查的最有效方式)。$lv1
、$lv2
和$lv3
之前写入&
,然后将中值保存到$lv3
。Demo这样做的好处是删除了键声明,并使代码更简洁。wgeznvg72#
事实证明,有一种方法可以使用usort()和array_walk()的组合来完成OP所寻求的任务,其中每一个都接受一个回调,如下所示:
请参见此处的演示。另外,请参见基于OP的sandbox的示例。
虽然OP的代码没有显示引用的数组键,但要注意它们应该在实际代码中,否则PHP将使用2017-05-01进行计算,您将看到一个2011的键。
我从here中提取的中值代码。
有趣的是,通过对数字进行排序来确定中位数的传统智慧并不一定是获得这一结果的唯一方法,显然,通过找到一个主元数字并将数字序列分为三部分也可以做到这一点,而且效率可能更高(见以下回应)。