У меня есть массив переменного размера, состоящий из пар ключ-значение; значения всегда являются числами с плавающей запятой, но ключи являются строками — например:
$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 ключей в массиве, которые могут различаться).
Вы можете попробовать что-то вроде этого.
$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)
Других решений пока нет …