За последние 24 часа нас посетили 185359 программистов и 1973 робота. Сейчас ищут 1150 программистов ...

Найти наименьшее число в массиве

Тема в разделе "PHP для новичков", создана пользователем romagromov, 18 апр 2017.

Метки:
  1. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Здравствуйте!
    Имеем массив чисел

    2.2, 2.3, 3.0, 4.0, 4.1, 4.2, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1

    Пытаюсь получить наименьшее таким образом:

    PHP:
    1. echo min ($valuesarray);
    Отображается число перед самым маленьким, то есть 2.3, вместо 2.2.

    Если из массива убрать 2.2 и 2.3, то отобразится 4.0 вместо 3.0 и так далее.

    Пробовал min не с массивом, а со строкой - тоже самое...

    Что я не так делаю?
    Спасибо.
     
    #1 romagromov, 18 апр 2017
    Последнее редактирование: 18 апр 2017
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Неправильно массив собираешь? У тебя там числа, или строковые представления чисел, то бишь числа в кавычках? Версия PHP какая? У меня все работает, пруф. Покажи целиком свой код.
     
  3. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Из базы приходит строка: 2.2, 2.3, 3.0, 4.0, 4.1, 4.2, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1
    Я собираю ее в массив
    PHP:
    1. <?php $valuesarray = explode(",", $item->fields["compatibility"]->display); ?>
    затем пытаюсь вывести минимальное значение

    PHP:
    1. <?php echo min ($valuesarray); ?>
    В виду того, что min работает не только с массивами, но и со строками, пробовал просто

    PHP:
    1. <?php echo min ($item->fields["compatibility"]->display); ?>
    Эффект такой же.

    PHP7
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.870
    Симпатии:
    753
    Адрес:
    Татарстан
    а ты перед нахождением мин - var_dump() массива сделай, посмотри что за числа там, что за типы
     
  5. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
  6. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Вот такое показывает:

    array(12) { [0]=> string(3) "2.2" [1]=> string(9) " 2.3" [2]=> string(9) " 3.0" [3]=> string(9) " 4.0" [4]=> string(9) " 4.1" [5]=> string(9) " 4.2" [6]=> string(9) " 4.4" [7]=> string(9) " 5.0" [8]=> string(9) " 5.1" [9]=> string(9) " 6.0" [10]=> string(9) " 7.0" [11]=> string(9) " 7.1" }
     
  7. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    PHP:
    1. <?php$valuesarray=explode(", ",$item->fields["compatibility"]->display);?>
    уот так уот попробуй
     
    TeslaFeo нравится это.
  8. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    теперь такое показывает

    array(1) { [0]=> string(113) "2.2, 2.3, 3.0, 4.0, 4.1, 4.2, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1" }

    но min не работает, выдает 2.2, 2.3, 3.0, 4.0, 4.1, 4.2, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1, вместо минимального значения
     
  9. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @romagromov, видишь у тебя в строке есть символ типо пробела? Вот походу это не пробел. Как у тебя строка формируется, которую потом эксплойдишь?
     
  10. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Это поле из компонента, как формируется пока не понял. Но суть проблемы уловил. Спасибо!
     
  11. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    PHP:
    1. <?php $pre=explode(",",$item->fields["compatibility"]->display);
    2. $delimiter = "," . substr($pre[1], 0, 6);
    3. $valuesarray = explode($delimiter,$item->fields["compatibility"]->display);
    4. echo min($valuesarray);
    5. ?>
    я наверно грёбанный наркоман...
     
  12. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Тут не в пробеле дело.

    Мой массив выглядит так:

    Код (Text):
    1. array(12) { [0]=> string(3) "2.2" [1]=> string(9) " 2.3" [2]=> string(9) " 3.0" [3]=> string(9) " 4.0" [4]=> string(9) " 4.1" [5]=> string(9) " 4.2" [6]=> string(9) " 4.4" [7]=> string(9) " 5.0" [8]=> string(9) " 5.1" [9]=> string(9) " 6.0" [10]=> string(9) " 7.0" [11]=> string(9) " 7.1" }
    а должен так:

    Код (Text):
    1. array(12) { [0]=> float(2.2) [1]=> float(2.3) [2]=> float(3) [3]=> float(4) [4]=> float(4.1) [5]=> float(4.2) [6]=> float(4.4) [7]=> float(5) [8]=> float(5.1) [9]=> float(6) [10]=> float(7) [11]=> float(7.1) }
    То есть не строковые, а плавающие... Может я неправильно explode делаю...
     
  13. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Ну ёмаё, я уже думал ты сделал)
    Ну давай вместе рассуждать. После твоей неудачной попытки я дал тебе эксплод с разделителем ", " (запятая+пробел). И он не сработал, хотя должен был, если бы это был пробел. Смотрим дальше.
    [0]=>string(3) "2.2" - 3 символа, всё отлично. Мы видим три символа. Это нулевой элемент
    А вот следующий элемент
    [1]=> string(9) " 2.3" - говорит, что в нём 9 строковых символов. Т.е. этот самый пробел, который мы видим глазами, кодируется шестью символами. И вот они могут вообще хз как обрабатываться. Учитывая ещё и то, что мы не знаем пока, что там вообще за символ.

    Отвечая на твой вопрос: нет, не должны быть там после эксплода флоаты. К флоатам там всё приводится при сравнивании.
    кстати, выведи var_dump((float)$valuesarray[1]);
    ну и чисто поржать попробуй запустить код, который я выше написал
     
    TeslaFeo нравится это.
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Народ, я с вас в шоке.
    Ну приходит массив со строковыми представлениями чисел. Ну прогоните его через фильтр.. Ну или прогоните через явное приведение типов в цикле.
    --- Добавлено ---
    Хотя, судя по
    оно и так работать должно.
    --- Добавлено ---
    Тогда фильтр.
     
    TeslaFeo и acho нравится это.
  15. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Твой код работает.
    Ты получаешь разделитель, а потом подставляешь его в explode.
    Просто, как-то громоздко получается.

    Это может оно: &nbsp ?

    var_dump((float)$valuesarray[1]); показывает float(0)

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

    Параллельно читаю на счет фильтров, но пока туго...
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Все там просто. Отдаешь фильтру переменную, указываешь тип фильтра вторым аргументом, типы фильтров есть там же в документации. Все. Если переменная удовлетворяет тому, что в фильтре, она возвращается, приведенная к тому типу, за который фильтр отвечает.
     
  17. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @romagromov, значит подумай над двумя вещами: либо фильтры, как говорит Суррикат, либо найти, что же там всё-таки за символ кроется и использовать его в качестве разделителя
     
  18. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Сейчас изучаю ООП, решил помочь ТС, поправьте, если где-то можно лучше сделать. Задача я так понимаю найти самое маленькое число в строке.
    PHP:
    1. <?php
    2.  
    3. class Version
    4. {
    5.     //public $ver = '2.2, 2.3, 3.0, 4.0, 4.1, 4.2, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1';
    6.  
    7.     public function ver($ver){
    8.         $ver = explode(', ', $ver);
    9.         return $ver;
    10.     }
    11.     public function minimum($a){
    12.         $a = self::ver($a);
    13.         $a = min($a);
    14.         return $a;
    15.     }
    16.     public function maximum($a){
    17.         $a = self::ver($a);
    18.         $a = max($a);
    19.         return $a;
    20.     }
    21. }
    22.  
    23. $ve = "2.2, 2.3, 3.0, 4.0, 4.1, 4.2, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1";
    24.  
    25. $object = new Version();
    26. $object_min = $object->minimum($ve);
    27. $object_max = $object->maximum($ve);
    28.  
    29. echo 'Минимальное значение: ' . $object_min;
    30. echo '<br>';
    31. echo 'Максимальное значение: ' . $object_max;
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Можно не писать свой PHP поверх существующего, усложняя решение, а не упрощая его. Это что касается самого решения написания обертки над однострочной функцией.

    Касательно самой реализации - ты определись, у тебя статический класс или нет. Создавать объект, а потом, внутри него, обращаться через ::self к методам - неправильно. На PHP7+ это должно вызывать ошибку, к слову.
     
  20. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Спасибо, я понял ошибку. Вот так правильнее будет?
    PHP:
    1. .....
    2.     public function minimum($a){
    3.         $a = $this->ver($a);
    4.         $a = min($a);
    5.         return $a;
    6.     }
    7.     public function maximum($a){
    8.         $a = $this->ver($a);
    9.         $a = max($a);
    10.         return $a;
    11.     }
    12. .....
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да, если ты все же не статику задумал. Но, по факту, это не ООП даже, а некое объектно-процедурное программирование. Суть в том, что объект - это не самоцель ООП. Это некая сущность, хранящая свое состояние. У тебя же получается, что объект предоставляет лишь некий набор stateless-методов. Для таких вещей правильнее делать статичную библиотеку, а не инстанцируемый класс.
     
  22. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    До этого я все процедурным методом писал, а потом открывал, даже то что месяц назад писал и понимал, что это можно сделать намного красивее и проще объектом, ну не переделывать же. Все с опытом приходит. Мне бы потренироваться в ООП, руку набить..
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не, красивее можно всегда, но писать библиотеку, реализующую двустрочный код на php в виде целого некоего API не совсем рационально. Ну и писать библиотеку под невероятно разовый кейс, который, опять же, решается двумя функциями, вложенными друг в друга, тоже не надо. Библиотека должна решать повторяющиеся комплексные проблемы.

    Хороший пример - файловая система. Работа с ней - это комплексная проблема, если ты хочешь действительно с ней работать, не зная проблем. Сначала тебе кажется, что это про записал-прочитал, а потом, оказывается, что там есть блокировки, права доступа, что нельзя записать файл в несуществующий каталог, и надо сначала создать его. И что блокировки есть разного типа. И что есть разные режимы чтения и записи. И что не хочется в куче мест в проекте городить тонны огородов. Хочется сказать write($path,$data) и не париться.

    То есть написание библиотеки не должно быть самоцелью. Библиотека должна не дублировать низкоуровневые пхп-функции и не должна быть заточена под узкий кейс. Она должна решать максимально абстрактную проблему в рамках своей задачи. Библиотека, умеющая читать из конкретной таблицы в БД - плохая. Библиотека, предоставляющая более высокоуровневый и удобный доступ к БД как таковой - хорошая.

    Библиотеки должны решать проблемы дублирования сложного кода. Дублирование же простого кода не является проблемой. Оно даже не всегда является поводом для написания отдельной функции. Есть тонкая грань между разумной декомпозицией и избыточной. Если эту грань перейти, приложение будет не упрощаться для понимания и поддержки, а наоборот.
     
  24. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Спасибо за подробное описание, смысл я понял в этом варианте достаточно было 2-х строк и не надо создавать библиотеку для дублирования низкоуровневых пхп-функций. Если была бы задача читать из базы данных, то можно было написать библиотеку, передать ей несколько параметров и она все сделает. То есть в простых вещах лучше идти простым методом, а когда стоит сложная задача, то можно уже и ООП применять. Эту грань не так легко поймать, если честно, я думаю с практикой все придет..
     
    Fell-x27 нравится это.
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Именно так.