Здравствуйте! Имеем массив чисел 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: echo min ($valuesarray); Отображается число перед самым маленьким, то есть 2.3, вместо 2.2. Если из массива убрать 2.2 и 2.3, то отобразится 4.0 вместо 3.0 и так далее. Пробовал min не с массивом, а со строкой - тоже самое... Что я не так делаю? Спасибо.
Неправильно массив собираешь? У тебя там числа, или строковые представления чисел, то бишь числа в кавычках? Версия PHP какая? У меня все работает, пруф. Покажи целиком свой код.
Из базы приходит строка: 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: <?php $valuesarray = explode(",", $item->fields["compatibility"]->display); ?> затем пытаюсь вывести минимальное значение PHP: <?php echo min ($valuesarray); ?> В виду того, что min работает не только с массивами, но и со строками, пробовал просто PHP: <?php echo min ($item->fields["compatibility"]->display); ?> Эффект такой же. PHP7
Вот такое показывает: 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" }
теперь такое показывает 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, вместо минимального значения
@romagromov, видишь у тебя в строке есть символ типо пробела? Вот походу это не пробел. Как у тебя строка формируется, которую потом эксплойдишь?
PHP: <?php $pre=explode(",",$item->fields["compatibility"]->display); $delimiter = "," . substr($pre[1], 0, 6); $valuesarray = explode($delimiter,$item->fields["compatibility"]->display); echo min($valuesarray); ?> я наверно грёбанный наркоман...
Тут не в пробеле дело. Мой массив выглядит так: Код (Text): 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): 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 делаю...
Ну ёмаё, я уже думал ты сделал) Ну давай вместе рассуждать. После твоей неудачной попытки я дал тебе эксплод с разделителем ", " (запятая+пробел). И он не сработал, хотя должен был, если бы это был пробел. Смотрим дальше. [0]=>string(3) "2.2" - 3 символа, всё отлично. Мы видим три символа. Это нулевой элемент А вот следующий элемент [1]=> string(9) " 2.3" - говорит, что в нём 9 строковых символов. Т.е. этот самый пробел, который мы видим глазами, кодируется шестью символами. И вот они могут вообще хз как обрабатываться. Учитывая ещё и то, что мы не знаем пока, что там вообще за символ. Отвечая на твой вопрос: нет, не должны быть там после эксплода флоаты. К флоатам там всё приводится при сравнивании. кстати, выведи var_dump((float)$valuesarray[1]); ну и чисто поржать попробуй запустить код, который я выше написал
Народ, я с вас в шоке. Ну приходит массив со строковыми представлениями чисел. Ну прогоните его через фильтр.. Ну или прогоните через явное приведение типов в цикле. --- Добавлено --- Хотя, судя по оно и так работать должно. --- Добавлено --- Тогда фильтр.
Твой код работает. Ты получаешь разделитель, а потом подставляешь его в explode. Просто, как-то громоздко получается. Это может оно:   ? var_dump((float)$valuesarray[1]); показывает float(0) Я пытаюсь сейчас разобраться с той переменной, чтобы символ убрать и не городить лишний код. Параллельно читаю на счет фильтров, но пока туго...
Все там просто. Отдаешь фильтру переменную, указываешь тип фильтра вторым аргументом, типы фильтров есть там же в документации. Все. Если переменная удовлетворяет тому, что в фильтре, она возвращается, приведенная к тому типу, за который фильтр отвечает.
@romagromov, значит подумай над двумя вещами: либо фильтры, как говорит Суррикат, либо найти, что же там всё-таки за символ кроется и использовать его в качестве разделителя
Сейчас изучаю ООП, решил помочь ТС, поправьте, если где-то можно лучше сделать. Задача я так понимаю найти самое маленькое число в строке. PHP: <?php class Version { //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'; public function ver($ver){ $ver = explode(', ', $ver); return $ver; } public function minimum($a){ $a = self::ver($a); $a = min($a); return $a; } public function maximum($a){ $a = self::ver($a); $a = max($a); return $a; } } $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"; $object = new Version(); $object_min = $object->minimum($ve); $object_max = $object->maximum($ve); echo 'Минимальное значение: ' . $object_min; echo '<br>'; echo 'Максимальное значение: ' . $object_max;
Можно не писать свой PHP поверх существующего, усложняя решение, а не упрощая его. Это что касается самого решения написания обертки над однострочной функцией. Касательно самой реализации - ты определись, у тебя статический класс или нет. Создавать объект, а потом, внутри него, обращаться через ::self к методам - неправильно. На PHP7+ это должно вызывать ошибку, к слову.
Спасибо, я понял ошибку. Вот так правильнее будет? PHP: ..... public function minimum($a){ $a = $this->ver($a); $a = min($a); return $a; } public function maximum($a){ $a = $this->ver($a); $a = max($a); return $a; } .....
Да, если ты все же не статику задумал. Но, по факту, это не ООП даже, а некое объектно-процедурное программирование. Суть в том, что объект - это не самоцель ООП. Это некая сущность, хранящая свое состояние. У тебя же получается, что объект предоставляет лишь некий набор stateless-методов. Для таких вещей правильнее делать статичную библиотеку, а не инстанцируемый класс.
До этого я все процедурным методом писал, а потом открывал, даже то что месяц назад писал и понимал, что это можно сделать намного красивее и проще объектом, ну не переделывать же. Все с опытом приходит. Мне бы потренироваться в ООП, руку набить..
Не, красивее можно всегда, но писать библиотеку, реализующую двустрочный код на php в виде целого некоего API не совсем рационально. Ну и писать библиотеку под невероятно разовый кейс, который, опять же, решается двумя функциями, вложенными друг в друга, тоже не надо. Библиотека должна решать повторяющиеся комплексные проблемы. Хороший пример - файловая система. Работа с ней - это комплексная проблема, если ты хочешь действительно с ней работать, не зная проблем. Сначала тебе кажется, что это про записал-прочитал, а потом, оказывается, что там есть блокировки, права доступа, что нельзя записать файл в несуществующий каталог, и надо сначала создать его. И что блокировки есть разного типа. И что есть разные режимы чтения и записи. И что не хочется в куче мест в проекте городить тонны огородов. Хочется сказать write($path,$data) и не париться. То есть написание библиотеки не должно быть самоцелью. Библиотека должна не дублировать низкоуровневые пхп-функции и не должна быть заточена под узкий кейс. Она должна решать максимально абстрактную проблему в рамках своей задачи. Библиотека, умеющая читать из конкретной таблицы в БД - плохая. Библиотека, предоставляющая более высокоуровневый и удобный доступ к БД как таковой - хорошая. Библиотеки должны решать проблемы дублирования сложного кода. Дублирование же простого кода не является проблемой. Оно даже не всегда является поводом для написания отдельной функции. Есть тонкая грань между разумной декомпозицией и избыточной. Если эту грань перейти, приложение будет не упрощаться для понимания и поддержки, а наоборот.
Спасибо за подробное описание, смысл я понял в этом варианте достаточно было 2-х строк и не надо создавать библиотеку для дублирования низкоуровневых пхп-функций. Если была бы задача читать из базы данных, то можно было написать библиотеку, передать ей несколько параметров и она все сделает. То есть в простых вещах лучше идти простым методом, а когда стоит сложная задача, то можно уже и ООП применять. Эту грань не так легко поймать, если честно, я думаю с практикой все придет..