X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Удалить последнее вхождение в строке
fedornabilkin
fedornabilkin
Topic Starter сообщение 10.4.2013, 13:09; Ответить: fedornabilkin
Сообщение #1


Что-то ничего подходящего не нашел в сети. Везде какие-то страшные куски кода прелдлагают.
Конкретно надо вот что.
Из массива генерирую пары (name = '$name', login = '$login',) для запроса в бд
и надо убрать последнюю запятую. В случае WHERE, надо убрать последний AND
Или как-то иначе можно сделать?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 10.4.2013, 13:32; Ответить: matroskin8
Сообщение #2


А покажите исходный массив и запрос(ы), который должен получиться в итоге.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
fedornabilkin
fedornabilkin
Topic Starter сообщение 10.4.2013, 13:48; Ответить: fedornabilkin
Сообщение #3


На данный момент метод выглядит так:
function field_val($par, $where=false){
  $sep = ($where) ? "AND" : ",";
  foreach( $par as $field => $val){
   $set .= " $field = '$val' $sep";
  }


  if($where)
   return "WHERE" . substr($set, 0, -3);
  else
   return "SET" . substr($set, 0, -1);
}


Массив where array('id'=>$id, 'login'=>$login);
Запрос: UPDATE users {то, что возвратит метод ( WHERE id = '1' AND login = 'fedornabilkin')}
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 10.4.2013, 14:02; Ответить: matroskin8
Сообщение #4


Да, в принципе, так можно и оставить - обрезать 3 или 1 символ в конце.
Ну еще, как вариант, можно при формировании предиката сделать проверку и в зависимости от ее выполнения добавлять AND или запятую, т.е. проверить остались ли пары в массиве и, если таковых нет больше, то и добавляться в конец ничего не будет:
foreach( $par as $field => $val){
if($set AND $field) $set .= " $sep"; // если предикат не пуст (не первая итерация) и есть очередная пара, тогда добавим AND или ,
$set .= " $field = '$val'";
}

Тогда и обрезать, вроде как, ничего не нужно будет.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
fedornabilkin
fedornabilkin
Topic Starter сообщение 10.4.2013, 15:15; Ответить: fedornabilkin
Сообщение #5


А как же отследить первую итерацию? Счетчик не охота вставлять туда.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
fedornabilkin
fedornabilkin
Topic Starter сообщение 10.4.2013, 15:47; Ответить: fedornabilkin
Сообщение #6


Немного подумал и решил просто добавлять сначала сепаратор, а потом удалять первое вхождение.
Так намного проще. В итоге получился довольно таки компактный и полезный метод.
function field_val($par, $sep){
  foreach( $par as $field => $val){
   $set .= " $sep $field = '$val' ";
  }
  return preg_replace('#'.$sep.'#', ' ', $set, 1);
}

Можно еще добавить третий необязательный параметр, который будет подставляться вместо =
Получится что-то типа explode, для работы с ключами и значениями.
[member=matroskin8], спасибо, направил на нужную мысль.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 10.4.2013, 16:14; Ответить: matroskin8
Сообщение #7


А как же отследить первую итерацию? Счетчик не охота вставлять туда.

А зачем нужно отслеживать первую итерацию? Она ведь и до этого, вроде как не отслеживалась. Но если все же нужна, то что мешает добавить еще одно условие - if(empty($set)){ // это и будет первой итерацией}
Кстати, в моем коде выше условие немного избыточно. Проверять есть ли очередная пара - совсем не обязательно, поскольку если ее нет, то в тело цикла мы больше и не попадем. Итого, можно так:
foreach( $par as $field => $val){
   if(empty($set)){
      // первая итерация, поскольку предикат пока пуст
   }else{
      $set .= " $sep"; // если предикат не пуст (не первая итерация), тогда добавим AND или ,
   }
   $set .= " $field = '$val'";
}
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
fedornabilkin
fedornabilkin
Topic Starter сообщение 10.4.2013, 16:41; Ответить: fedornabilkin
Сообщение #8


Если на то пошло, тогда двумя строками ограничиваемся :)
foreach( $par as $field => $val){
   if(empty($set))  $set .= " $field = '$val'";
   else $set .= " $sep  $field = '$val";
}

Вообще красота
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 10.4.2013, 16:52; Ответить: matroskin8
Сообщение #9


Ну да)

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Нужно удалить сообщение из форума
негативный отзыв
1 gruz333 2992 14.9.2018, 9:59
автор: Palundra
Открытая тема (нет новых ответов) Нужно удалить второй description
Ищется спец по wordpress
3 Ksardas777 2110 21.3.2017, 15:54
автор: Ksardas777
Открытая тема (нет новых ответов) Нужно удалить следы вирусной атаки на сайт
Залили дор
3 Ksardas777 1817 7.3.2017, 14:31
автор: Ksardas777
Открытая тема (нет новых ответов) Удалить @media для мобильных устройств / HTML, CSS
2 The World Is Mine 9102 7.2.2014, 20:10
автор: -LyalinDV-
Открытая тема (нет новых ответов) Помогите удалить вирус на joomla 1.5
Готов оплатить помощь.
5 pulsar21 4407 17.5.2013, 8:00
автор: pulsar21


 



RSS Текстовая версия Сейчас: 20.4.2024, 0:47
Дизайн