Вопрос № 92674: Здравствуйте, эксперты.
Подскажите мне решение такой задачи, а то вариантов много, а выбрать наиболее оптимальный сложно.
Есть строки:
v.1.0.12.3
v.5.2.4.53
v.1.12.3.54
v.2.33.54.2
v.7.1024.1.23
v.4.55.32.12
К...Вопрос № 92724: Здравствуйте!
У меня такая проблема:
Наконец я добрался до изучения php. И вот дошел до главы: Проверка информации введеной в форму (Мне нужно проверить ввел ли человек имя, мыло, пароль. На мыле и-мэиле особенно нужно остановиться) Но вот пр...
Вопрос № 92.674
Здравствуйте, эксперты.
Подскажите мне решение такой задачи, а то вариантов много, а выбрать наиболее оптимальный сложно.
Есть строки:
v.1.0.12.3
v.5.2.4.53
v.1.12.3.54
v.2.33.54.2
v.7.1024.1.23
v.4.55.32.12
Как можно догадаться - это версии ПО.
Надо отсортировать их по возрастанию и/или выбрать наибольшую.
Спасибо.
Отправлен: 24.06.2007, 12:06
Вопрос задал: Sea (статус: 4-ый класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Powoditch konstantin
Здравствуйте, Sea!
Я думаю что есть два пути: тяжелый и очень простой.
Тяжелый: Разбиваете каждую версию в масив с помощью explode и в цикле сравниваете ети версии между собой, но нут возникает проблема как сравнить версии которые разнятся между собою количеством символов.
Легкий: Делаете $V= explode('.', $version);
$v = array_shift($V);// удаляем 'v'
$mul = "1";
for($i=0;$i
settype($mul,"integer"); $result = array();
for($i=$mul,$j=0;$i<=1,$j
// всё, теперь в масиве есть "стоимость" етой версии, тоисть версия разбивается на части разделенные точкой, потом они множатся на 10000, 1000, и т.д., тоисть для каждой версии получается например:
v2.1.05.2 $res = 2*1000+1*100+05+10+2+1; - одно число
v2.0.15.2 $res = 2*1000+0*100+10+10+2+1; - одно число, меньше чем первое. тоисть можно сделать вывод что первая версия больше и пометить ёё в масиве как большую.
можете этот участок кода закинуть в цикл , просчитать все "стоимости" каждой из версий, сформировать ассоциативный массив из названии версии и ёё "стоимости" и в результате отсортировать масив по "стоимости".
Вот видите всё просто -)
Ответ отправил: Powoditch konstantin (статус: 1-ый класс)
Ответ отправлен: 24.06.2007, 12:54 Оценка за ответ: 4 Комментарий оценки: Не все так просто :) Вот вам пример: 0.0.2.2 => 0*1000+0*100+2*10+2*1 = 22 0.0.1.28 => 0*1000+0*100+1*10+28*1 = 38 Посчитав получается, что второй вариант больше, но ведь это не так. Можно конечно усложнить этот вариант: домножать не на 10, а на 10^n, где n - это количество цифр в числе справа после точки.
Но ведь должен же быть совсем
простой способ.
Отвечает: Игорь Елизаров
Здравствуйте, Sea!
могу предложить решение.. довольно нетривиальное , но простое..
Если это разовое действие, то можно предложить следующий алгоритм
если это текстовый файл, то можно втянуть его например в EXCEL , приняв разделителем полей точку.
Да, все поля (кроме первого) надо сделать цифровыми.
Ну и все.
теперь средствами EXCEL сортируем полученные данные сразу по второму, третьему и четвертому полю
--------- Пользователь - тоже человек..
Ответ отправил: Игорь Елизаров (статус: Студент)
Ответ отправлен: 24.06.2007, 20:10 Оценка за ответ: 4 Комментарий оценки: Это конечно отсортирует данные, но если бы такой вариант меня интересовал, то врятли бы я задал этот вопрос в эту рубрику. Естественно нужна програмная реализация и желательно на PHP.
Отвечает: Шпилевский Евгений Васильевич
Здравствуйте, Sea!
Разбиваешь все строку $a = explode($s,".");
Получаешь массив.. так для каждого...
А затем просто сравниваешь
// $b - массив с версиями
for ($i=0; $i<count($b); $i++)
{
$a[$i] = explode($b[$i],".");
}
$mx=0;
for ($i=1; $i<count($b); $i++)
{
foreach($a[$i] as $k=>$v)
{
if ($a[$mx][$k] < $v)
{
$f = false;
break;
}
if ($a[$mx][$k] > $v)
{
$f = true;
break
}
}
if ($b) $mx=$i;
}
не тестировал, но думаю мысль понятна даже с ошибками :)
Ответ отправил: Шпилевский Евгений Васильевич (статус: 1-ый класс)
Ответ отправлен: 25.06.2007, 12:13 Оценка за ответ: 4 Комментарий оценки: Спасибо за вариант, хотя он и не оптимальный и с ошибками. Я раньше использовал нечто подобное:
foreach($v[$i] as $index => $value) { if ($v[$indexMax][$index] == $value) { continue; } else if ($v[$indexMax][$index] < $value) { $indexMax = $i; }
break; } }
print 'Max version: ' . $versions[$indexMax]; ?>
А сейчас нашел простой вариант: есть стандартная функция в PHP version_comp
are("v.1.0.12.22", "v.1.0.11.31"); :)
Так что ответов больше не надо. Всем спасибо.
Вопрос № 92.724
Здравствуйте!
У меня такая проблема:
Наконец я добрался до изучения php. И вот дошел до главы: Проверка информации введеной в форму (Мне нужно проверить ввел ли человек имя, мыло, пароль. На мыле и-мэиле особенно нужно остановиться) Но вот проблема - примеры, которые есть в учебнике не работают. сервак ошибку выдает. Пример формы в приложении. И прошу не советовать мне создать файл .htaccess со строчкой php_value error_reporting 7. Это уже сделано.
Зарание спасибо!
Я, например, пользуюсь следущими конструкциями для проверки логина и e-mail:
if (!preg_match("/^[A-Za-z0-9_]*$/i",$_POST["login"])) {print "Логин должен состоять только из латинских букв, цифр и знака подчеркивания!";}
else {//логин правильный}
if (isset($_POST["email"]) and $_POST["email"]<>"" and !preg_match("/^(?:[a-z0-9]+(?:[-_]?[a-z0-9]+)?@[a-z0-9]+(?:.?[a-z0-9]+)?.[a-z]{2,5})$/i",$_POST["email"])) {print "Проверьте правильность введенного адреса электронной почты (e-mail).";}
else { //e-mail верен}
Ответ отправил: Устинов С.Е. (статус: Профессионал) Украина, Славянск Организация: SlavComp WWW:Физико-математический факультет СГПУ ICQ: 6755675 ---- Ответ отправлен: 24.06.2007, 19:11 Оценка за ответ: 5
Отвечает: Sea
Здравствуйте, Bios (Basic input/output system)!
Если вам не надо контролировать правильность этих значений, а только их наличие, то:
(если в форме используется method="post", то $_POST, а если method="get", то $_GET)
Файл login.php
<?php
if (!isset($_POST['name']))
{
echo '<br />Не заполнено поле Имя';
}
if (!isset($_POST['email']))
{
echo '<br />Не заполнено поле E-mail';
}
?>
Ответ отправил: Sea (статус: 4-ый класс)
Ответ отправлен: 25.06.2007, 12:12 Оценка за ответ: 5 Комментарий оценки: Благодарствую. Вы мне спасли жизнь, корьеру и репутацию. Огромное спасибо.