Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 700
от 30.06.2007, 02:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 423, Экспертов: 52
В номере:Вопросов: 2, Ответов: 5


Вопрос № 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; - одно число, меньше чем первое. тоисть можно сделать вывод что первая версия больше и пометить ёё в масиве как большую.
можете этот участок кода закинуть в цикл , просчитать все "стоимости" каждой из версий, сформировать ассоциативный массив из названии версии и ёё "стоимости" и в результате отсортировать масив по "стоимости".
Вот видите всё просто -)


Отредактировано: двойное обращение.
---------
=deepTeNk= (Профессионал)
Ответ отправил: 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
Комментарий оценки:
Спасибо за вариант, хотя он и не оптимальный и с ошибками.
Я раньше использовал нечто подобное:

$versions = array(
"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"
);

$v = array();
$indexMax = 0;
for ($i = 0; $i < sizeof($versions); $i++)
{
$v[$i] = explode(".", $versions[$i]);

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. Это уже сделано.
Зарание спасибо!

Приложение:

Отправлен: 24.06.2007, 18:58
Вопрос задал: Bios (Basic input/output system) (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Устинов С.Е.
Здравствуйте, Bios (Basic input/output system)!

Я, например, пользуюсь следущими конструкциями для проверки логина и 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
Комментарий оценки:
Благодарствую. Вы мне спасли жизнь, корьеру и репутацию. Огромное спасибо.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное