Как получить минимальное, максимальное и среднее значения в массиве пар ключ => значение в PHP?

У меня есть массив переменного размера, состоящий из пар ключ-значение; значения всегда являются числами с плавающей запятой, но ключи являются строками — например:

$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 до дюжины), а также числовые диапазоны в их значениях (всегда положительное число с плавающей запятой или целое число).
Мне нужно сохранить ключи в каждой группе, так как позже мне понадобится их использовать.

Я знаю, что есть min () и max (), но они предназначены для списков чисел, а не пар ключ-значение.

В идеале я хотел бы получить что-то вроде этого:

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

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

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

В конце концов мне нужно только сохранить ключи для последующего использования из этих трех массивов выше. (В приведенном выше примере предполагается наличие 5 ключей в массиве, которые могут различаться).

0

Решение

Вы можете попробовать что-то вроде этого.

$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)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]