[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нужна помощь в создании скрипта
Страницы: 1, 2
Shroff
Всем доброго дня.
При написании скрипта столкнулся вот с какой проблемой

Есть входящие данные в виде интервалов:
1950000-1959999
1960000-1969999
2170000-2187999

На выходе необходимо получить следующее:
195
196
217
2180
2181
2182
2183
2184
2185
2186
2187

Если честно не знаю как правильно называется подобное преобразование.
Может у кого есть идеи относительно того как реализовать подобное на php.
Спасибо.
Игорь_Vasinsky
в зависимости от чего то 3 цифры то 4 ?

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Shroff
В рамках проекта данные числа будут использоваться для поиска соответствия путем побайтового сравнения. Проект достаточно специфический, все решаемо, только вот уткнулись в данную задачку.

Суть преобразования в следующем:

Из диапазона 2170000-2187999 мы получаем
217
2180
2181
2182
2183
2184
2185
2186
2187

В дальнейшем при сравнении будем проверять:
217 = от 2170000 до 2179999
2180 = от 2180000 до 2180999
2181 = от 2181000 до 2181999
...
2187 = от 2187000 до 2187999
sergeiss
Цитата (Shroff @ 5.05.2015 - 19:43)
Может у кого есть идеи относительно того как реализовать подобное на php.

Проблема-то в чем? Отсортировать или преобразовать 1950000 в 195 и т.д.?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Shroff
Цитата (sergeiss @ 5.05.2015 - 23:24)
Проблема-то в чем? Отсортировать или преобразовать 1950000 в 195 и т.д.?


Именно преобразовать диапазон в массив. Таких диапазонов великое множество. Нужно общее правило приведения их к требуемому виду.
sergeiss
Цитата (Shroff @ 5.05.2015 - 23:29)
Нужно общее правило приведения их к требуемому виду.

Ну давай подумаем smile.gif У меня "просится" такой алгоритм. Для примера возьмем 2170000-2187999. Писать буду алгоритм, на ПХП сам переводи. Для любого диапазона, мне кажется, будет работать.

1. Преобразуем границы диапазона в числа.
2. Затем "само просится" добавить 1 ко второму числу. Получим 2188000.
3. Сравниваем границы, рассматривая их как символьные строки. Отсекаем от конца, по одному символу, до тех пор, пока они одинаковые. В примере получаем новый диапазон 2170-2188.
4. Опять преобразуем в числа.
5. Затем строим последовательность от начала нового диапазона до конца, с шагом 1, но без равенства концу диапазона (т.е. на единицу меньше, от 2170 до 2187).
6. Получаем
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
7. Анализируем полученные данные... Автоматически, естественно smile.gif И видим, что у нас есть полный диапазон от 2170 до 2179. Поэтому его можно ужать до 217. А всё, что начинается на 218, остается. В итоге имеем:
217
2180
2181
2182
2183
2184
2185
2186
2187
То есть то, что и нужно было.

Берем любой другой диапазон, например 1950000-1959999, запускаем в этот алгоритм, и получаем искомое 195 (уже на 6-м шаге).

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Shroff
Мне нравится) Сижу весь день, голова забита, сейчас понимаю, что все не так-то и сложно)
Буду пробовать переносить в php. Заранее спасибо. По результатам отпишу.

P.S. Если есть желание подсказать с реализацией на php не откажусь)
sergeiss
Цитата (Shroff @ 5.05.2015 - 23:49)
P.S. Если есть желание подсказать с реализацией на php не откажусь)

Ежели ты знаком с ПХП, то напишешь smile.gif Прямо по алгоритму, "в лоб". Потом можно будет, возможно, как пооптимизировать.
Вообще говоря, тут нет никакой специфики ПХП.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Shroff

function reverse($array)
{
foreach ( $array as $value )
{
$tmp[] = implode("",array_reverse(str_split($value)));
}
return $tmp;
}

function comtoarr($range)
{
$range[1]++;
$tmp = reverse($range);

while(TRUE)
{
if($tmp[0][0] == $tmp[1][0])
{
$tmp[0] = substr($tmp[0],1);
$tmp[1] = substr($tmp[1],1);
}
else break;
}

$range = reverse($tmp);

$j=1;
while($range[0]<$range[1])
{
$narr[$j] = $range[0];
$range[0]++;
$j++;
}

return $narr;
}


$range = array(2170000,2187999);
print_r(comtoarr($range));



Вот, что получилось, глаза не видят уже.
Пока не одолел 7-й пункт. " Анализируем полученные данные... Автоматически, естественно smile.gif И видим, что у нас есть полный диапазон от 2170 до 2179. Поэтому его можно ужать до 217. А всё, что начинается на 218, остается"
С удовольствием приму помощь)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.