Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 5,6,7-20,35,100-400,550,549,548, Нужно это получить в массив поочередно 
:(
    Опции темы
Wowa
  Дата 17.4.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



Дана строка: 5,6,7-20,35,100-400,550,549,548
Нужно обработать все элементы с заданными ИД в этом списке и интревалах. По идее, нужно бы это все обработать и закинуть все номера в массив. Но если будет указана строка, типа: 3,4,5,7,100-10000, то получиться, что нужно будет 9004 элемента записывать в массив, что имхо довольно много. А ведь можешь быть еще больше. Как поступить в этом случае, чтобы не заносить все поэлементно в массив, а затем через foreach обрабатывать. Есть какие-нибудь мысли?
PM WWW   Вверх
Irokez
Дата 17.4.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 22
Всего: 53



я бы сделал так:
1) разбить строку по запятым, получил бы массив: (3 4 5 6 100-10000)
2) циклом foreach пройтись по полученному массиву, определяя является ли элемент числом или же интервалом, если числом, то получить элемент с ID равному заданному числу, если интервалом, то определить границы интервала (регекспом или др строковыми ф-циями) и через цикл while или do .. while совершать операции над элементами с ID, находящимися в полученном интервале
PM   Вверх
IZ@TOP
Дата 18.4.2005, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Wowa, а зачем тебе это нужно? Может быть есть более простое решение?

Варианты Ирокеза поддерживаю. Кроме того что цикл foreach нужен smile Можно и for использовать.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Wowa
Дата 18.4.2005, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



Цитата(IZ @ 18.4.2005, 06:01)
Wowa, а зачем тебе это нужно? Может быть есть более простое решение?

Есть база с записями. У каждой записи есть ИД. Мне нужно удалить в ней определенные записи.
PM WWW   Вверх
Akina
Дата 18.4.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



По методу Irokez-а я бы:

1) без изменений
2) Преобразовать массив из полученного вида в массив типа Start-End, т.е. для указанного случая

3 3
4 4
5 5
6 6
100 10000

Дальше уже работать много проще...

Код

for (i=1; i<n; i++)
{
   for (j=Start(i); j<End(i); j++)
   {
      ...
   }
}



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Wowa
Дата 24.4.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



А что сделать быстрее

выполнить N раз это:
Код

DELETE FROM table WHERE id=$i;


или один раз это:
Код

DELETE FROM table WHERE id IN ($array);


?
PM WWW   Вверх
Sardar
Дата 24.4.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(Wowa @ 24.4.2005, 10:47)
или один раз это

Конечно вторым способом.

По вопросу: бьём список на числа и интервалы. Все числа сгруппировать в один IN, а интервалы в несколько OR BETWEEN.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sardar
Дата 24.4.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Вот простенький пример за 5 минут, не проверяющий верность интервала(100-5), и не имееющий отрицания(NOT IN, NOT BETWEEN):
Код
/**
* Строку с числами и интервалами в условие SQL.
* @param $s - сама строка
* @param $target  - на кого ссылаемся в условии
*/
function toQueryExpression($s, $target) {
  $s=explode(",", $s);
  $ids=array();
  $ranges="";
  $ret="";

  for($i=0; $i<sizeof($s); $i++) {
    $el=explode("-", $s[$i]);
    if(sizeof($el)==1) $ids[]=$el[0];
    else $ranges.="OR {$target} BETWEEN {$el['0']} AND {$el['1']} ";
  }
  if(sizeof($ids)>0) {
    $ret="{$target} IN(".implode(", ",$ids).") ";
    $ret.=$ranges;
  } else $ret=substr($ranges, 2);
  return $ret;
}

//test
echo toQueryExpression("5,6,7-20,35,100-400,550,549,548", "id"), "<br>";
echo toQueryExpression("2-5, 45-78", "id"), "<br>";
echo toQueryExpression("1,2,3,4,5", "id"), "<br>";



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.