如何在 PHP 中的键 => 值对数组中获取最小值、最大值和平均值?

Posted

技术标签:

【中文标题】如何在 PHP 中的键 => 值对数组中获取最小值、最大值和平均值?【英文标题】:How to get min, max and average values in array of key=>value pairs in PHP? 【发布时间】:2015-02-15 13:20:58 【问题描述】:

我有一个由键值对组成的可变大小数组;值始终是浮点数,但键是字符串 - 例如:

$prices = array( 
    'name'   => 99.23
    'abc'    => 239.2,
    'xyz'    => 102.452,
    'foobar' => 152,
    'barfoo' => 159.2394
    ...
)

我需要得到至少三个值,但这也取决于数组的大小。 例如,如果数组由 6 个键组成,我想得到两个最低的,两个最高的,剩下的两个(应该在中间)。如果是 7 个键,可能是 2 个最低,2 个最高,中间 3 个。如果 8 个,可能是 3-2-3...

我不确定如何创建模式,但理想情况下应该尽可能均匀分布,或者如果考虑到平均剩余值中有点过高或过低的价格(以及而是将它们分别推到最高或最低的组中)。

我无法提前知道数组中键的数量(甚至可能只有 1 到 12 个),也无法知道它们的值的数值范围(始终为正浮点数或整数)。 我需要保留每个组中的密钥,因为我以后需要使用它们。

我知道有 min() 和 max() 但它们是用于数字列表而不是键值对。

理想情况下,我想得到这样的东西:

$lowest = array(
    'name'   => 99.23
    'xyz'    => 102.452
);

$highest = array(
    'abc'    => 239.2,
    'barfoo' => 159.2394
);

$average = array(
    'foobar' => 152,
);

最终我只需要保留上面这 3 个数组中的键以供以后使用。 (上面的示例假设数组中有 5 个键,可能会有所不同)。

【问题讨论】:

php.net/asort,然后是php.net/array_slice,但你喜欢它。如果您需要更具体的帮助,则必须给出更具体的目标。 好吧,array_slice 再次通过对0,2-22,-2 进行切片使这变得微不足道。但是,由于您似乎不确定这就是您想要的,因此很难给您具体的建议。 我正在阅读文档,谢谢 【参考方案1】:

你可以试试这样的。

$prices = array( 
    'abc' => 239.2,
    'xyz' => 102.452,
    'foobar' => 152,
    'barfoo' => 159.2394,
    'be' => 26.234,
    'dfi' => 789.233
    );

$len1 = ceil(count($prices)/3);    //calculate boundary array length
$len2 = count($prices) - 2*$len1;  //calculate middle array length

sort($prices);  //sorting array

$array1 = array_slice($prices,0,$len1);   //get first array (min)
$array2 = array_slice($prices,$len1,$len2);   //get second array (middle)
$array3 = array_slice($prices,$len1+$len2,$len1);   //get third array (max)

【讨论】:

感谢 Sampath - 有了你的回答和 deceze 评论,我想我可以为此使用 sort - 更准确地说是 asort,因为我需要保留我的密钥(在上面的示例中,你提到了 sort,它扔掉数组键)。我还修改了数组的构建方式,但你提供了一个很好的提示,谢谢

以上是关于如何在 PHP 中的键 => 值对数组中获取最小值、最大值和平均值?的主要内容,如果未能解决你的问题,请参考以下文章

将相同的键=>值对分配给PHP中的多个数组

如何获取与php数组中的键和值相关的所有数组值

如何取得数组中前3个最大值的键值?最好是php语言,其他也可。

如何使用php在foreach循环中获取多维数组的键? [复制]

在php中如何取键?

PHP 根据配置转换数组中的键名 方便给前端的时候改键名