Перейти к содержимому



Удалить последнее вхождение в строке

#1 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91
0

Отправлено 10 Апрель 2013 - 12:09

Что-то ничего подходящего не нашел в сети. Везде какие-то страшные куски кода прелдлагают.
Конкретно надо вот что.
Из массива генерирую пары (name = '$name', login = '$login',) для запроса в бд
и надо убрать последнюю запятую. В случае WHERE, надо убрать последний AND
Или как-то иначе можно сделать?

 

 

  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 10 Апрель 2013 - 12:32

А покажите исходный массив и запрос(ы), который должен получиться в итоге.
  • 0


#3 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 10 Апрель 2013 - 12:48

На данный момент метод выглядит так:
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')}
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 10 Апрель 2013 - 13:02

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


#5 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 10 Апрель 2013 - 14:15

А как же отследить первую итерацию? Счетчик не охота вставлять туда.
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#6 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 10 Апрель 2013 - 14:47

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


#7 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 10 Апрель 2013 - 15:14

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

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

  • 0


#8 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 10 Апрель 2013 - 15:41

Если на то пошло, тогда двумя строками ограничиваемся :)
foreach( $par as $field => $val){
   if(empty($set))  $set .= " $field = '$val'";
   else $set .= " $sep  $field = '$val";
}
Вообще красота
  • 1
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#9 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 10 Апрель 2013 - 15:52

Ну да)
  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru