Получение минимального и максимального значения в массиве PHP не показывает правильные числа - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующий массив:

Array
(
    [0] => 124,95
    [1] => 139,95
    [2] => 149,95
    [3] => 1200
    [4] => 150
    [5] => 154,95
    [6] => 130
    [7] => 189,95
    [8] => 199,95
    [9] => 30
    [10] => 150
)

И я пытаюсь получить из него самые низкие (30) и самые высокие (1200) числа.

Итак, я сделал это:

while($getpricesproducts = $getpricesproductscon->fetch_assoc()){
  $prijsarray[] = $getpricesproducts['prijs'];
}

// Lowest and highest price to put in price slider
$prijslow = min($prijsarray);
$prijshigh = max($prijsarray);

echo $prijslow;

echo $prijshigh;

$prijsarray выше массива.

Но отраженные значения равны 30 как минимальное число и 150 как максимальное.Это почему?Это как-то связано с запятыми в некоторых числах?Тем не менее, странно, что число 1200 не является максимальным, поскольку у него нет запятых.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Как сказано в документации по максимальной функции:

Значения различных типов будут сравниваться с использованием стандартных правил сравнения.Например, нечисловая строка будет сравниваться с целым числом, как если бы оно было 0, но несколько нечисловых строковых значений будут сравниваться буквенно-цифровым способом.Возвращаемое фактическое значение будет иметь исходный тип без преобразования.

Таким образом, вы можете попытаться преобразовать все значения в плавающее перед вставкой в ​​массив:

while($getpricesproducts = $getpricesproductscon->fetch_assoc()){
  $prijsarray[] = floatval(str_replace(',', '.', $getpricesproducts['prijs'])); 
}

// Lowest and highest price to put in price slider
$prijslow = min($prijsarray);
$prijshigh = max($prijsarray);

echo $prijslow;

echo $prijshigh;
0 голосов
/ 14 февраля 2019

Вы можете использовать array_map с strtr, чтобы преобразовать все числа в вашем массиве из их текущего формата в число с плавающей запятой.Затем вы можете взять min и max и использовать number_format, чтобы преобразовать их обратно в ваш формат:

$new_array = array_map(function ($v) { return (float)strtr($v, array(',' => '.', '.' => '')); }, $array);
echo number_format(min($new_array), 2, ',', '.') . "\n";
echo number_format(max($new_array), 2, ',', '.') . "\n";

Вывод:

30,00
1.200,00

Демонстрация на 3v4l.org

0 голосов
/ 14 февраля 2019

Вы можете исправить свой код, как показано ниже:

while($getpricesproducts = $getpricesproductscon->fetch_assoc()){
    $prijsarray[] = (float) str_replace(',', '.', $getpricesproducts['prijs']);
}

Но, как отмечалось в других комментариях, было бы лучше, если бы вы исправили свою базу данных для хранения цен в виде плавающих чисел.

...