[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разбиение строки
Зодчий
Добрый день!
Помогите с задачкой.
Значение переменной может выглядеть след. образом
$a="1,2,4,8";
$a="1-7";
$a="1,2-6,7,8";
Нужно разбить по запятой, потом восстановить диапазон и занести данные в таблицу SQL.
Как я понимаю разбить можно так?
 $str = "1,4,5,6-9,10"; 
$arr = explode(",",$str);
for($i = 0; $i < count($arr); $i++)
{
echo $arr[$i]."<br />";
}

Диапазон восстановить

$data = "1-8";
list($min, $max) = explode("-", $data);
for($i = $min; $i <= $max; $i++)
{
echo $i."<br>";
}


А вот как это свести в одно и записать в столбец SQL?



Спустя 9 минут, 25 секунд (15.04.2011 - 09:54) Игорь_Vasinsky написал(а):
Во первых - ты правильно использовал explode чтобы занеси данные в массив, но


$a="1,2,4,8";
$a="1-7";
$a="1,2-6,7,8";


1. $a="1,2,4,8"; - еxplode - разделитель запятая
2. Тут разделитель "-" - а значить нужно перебрать все цифры от 1-7 - потом записать с помощью implode в строку (с разделителем ",")
3. - как п.1 + п.2.

implode() - функция обратная explode()
вот с помощью её и формируй строку - записывай в переменную и пиши в БД

Спустя 1 час, 23 минуты, 53 секунды (15.04.2011 - 11:18) Зодчий написал(а):
Значение вводят пользователи и заранее предсказать невозможно,что они введут.
По-этому нужно всегда проверять и на запятую и на дефис.
Именно общая проверка и никак не получается.

Спустя 1 минута, 31 секунда (15.04.2011 - 11:20) Игорь_Vasinsky написал(а):
а почему бы не установить правило для пользователей или

писать регулярку и парсить

Спустя 15 минут, 25 секунд (15.04.2011 - 11:35) Зодчий написал(а):
Правило не пойдет,т.к. это основная задача формы.
Пользовательн указывает значения.Если они не подряд, то указывает через запятую, если неколько по очереди, то диапазон.
В регулярках я не силен...

Спустя 14 минут, 32 секунды (15.04.2011 - 11:50) Oyeme написал(а):

$str = "1,4,5,6-9,10,15-88";
$arr = explode(",",$str);

for($i = 0; $i < count($arr); $i++)
{
if(strpos($arr[$i],'-'))
{
$ex = explode('-',$arr[$i]);
for($k=$ex[0];$k<=$ex[1];$k++)
{
echo $k."<br />";
}
}

else {
echo $arr[$i]."<br />";
}

}

Спустя 2 минуты, 43 секунды (15.04.2011 - 11:52) Игорь_Vasinsky написал(а):
Значит так, смотри:

есть переменная, ведённая пользователем:

1. либо 1,2
2. либо 1-3
3. либо 1-3,4,5-10

Цель: получить массив чисел, которые хотел указать пользователь.

Алгоритм:

1. Получить переменную
2. Проверить - содержит ли она интервал значений (-)
2.1 если нет - то формировать массив (explode())
2.2 если да - то получить этот интервал нормальном виде (for)
2.2.1 сформировать строку (разделитель "," - implode())
2.2.2 записать полученную строку в переменую
2.2.3 Заменить интервал в переменной от пользователя на свою переменую
3. Если не содержит интервала - то сформировать массив

В итоге получаем все числа.

Спустя 38 секунд (15.04.2011 - 11:53) Игорь_Vasinsky написал(а):
а вот и код..... laugh.gif

Спустя 1 минута, 18 секунд (15.04.2011 - 11:54) Invis1ble написал(а):
можно примерно так:
$string = '1,2,3-6,7';

$items = explode(',', $string);

foreach ($items as $k => $item)
if (preg_match('#-#', $item))
{
list($min, $max) = explode('-', $item);
unset($items[$k]);
$items = array_merge($items, range($min, $max));
}

Спустя 1 час, 35 минут, 20 секунд (15.04.2011 - 13:30) Зодчий написал(а):
Игорь_Vasinsky, спасибо за подробнейшие разъяснения!
Oyeme,Спасибо за код. Сравниваю со своими художествами.Ищу где неправильно пошел.
Invis1ble,спасибо!

Быстрый ответ:

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