Инфо-Предприятие - Форум
ПрограммыПоддержкаКупитьПартнерам

Вернуться   Инфо-Предприятие - Форум > Платформа разработки > Общий
Регистрация Обмен опытом Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Внимание! Этой ветке форума больше трех лет. Возможно, обсуждаемые здесь вопросы уже не актуальны. Тем не менее, Вы можете отвечать в этой теме, если при ответе поставите флажок.
  #1  
Старый 03.10.2014, 12:46
Аватар для kaetank
kaetank kaetank вне форума
Форумчанин
 
Регистрация: 24.07.2009
Адрес: г. Владимир
Сообщений: 360
По умолчанию Из строки в массив

Как программно получить массив из строки? что0то вроде implode.

Задача. Есть в определениях строка которая содержит перечень ид услуг(копаю ЖКХ). Он выглядит как строка значений разделенная точками с запятой. Заполняется пользователем в настройках ЖКХ. Служит для определения списка первоочередных услуг подлежаших оплате при частичной оплате извещения.
В моменте оплаты нужно определить - есть ли в списке оплачиваемых услуг первоочередные и если есть то сначала гасить их.
Видится следующий алгоритм.
Преобразовать строку в массив, потом используя оператор ИЗ при пробежке выяснять статус начисления.
Попробовал создать функцию
Однако
Код:
ФУНКЦИЯ *: ПолучитьМассивИзСтроки(СТРОКА:парам,разд)
   ПолучитьМассивИзСтроки=""
   ЦИКЛ ДЛЯ(сл=1,ВСЕГО_СЛОВ(парам,разд))       
     ПолучитьМассивИзСтроки!сл=СЛОВО(сл,парам,разд)
   КОНЕЦ_ЦИКЛА                                      
   ЕСЛИ ВСЕГОМ(МасСлов)>0 ТО ПолучитьМассивИзСтроки=МасСлов КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
не работает, поскольку ожидает в возврате единственное значение.
пробовал сам идентификатор функции внутри представить как масив - снова засада.

Как вернуть массив из функции? или только через глобальные переменные?
типа

Код:
ПЕРЕМ МассПервУслуг!                                         
ФУНКЦИЯ ЛОГИКА: ПолучитьМассивИзСтроки(СТРОКА:парам,разд)    
   ПолучитьМассивИзСтроки=НЕТ                                
   ЦИКЛ ДЛЯ(сл=1,ВСЕГО_СЛОВ(парам,разд))                     
     МассПервУслуг!сл=СЛОВО(сл,парам,разд)                   
   КОНЕЦ_ЦИКЛА                                               
   ЕСЛИ ВСЕГОМ(МассПервУслуг)>0 ТО ПолучитьМассивИзСтроки=ДА КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
но тогда надо постоянно следить за этими глобалами((


Ну и как бы повыяснять насчет многомерных массивов - коллекций данных? нет такой возможности? а то приходится плодить кучу одномерных массивов - в каждом своя "данная"
типа
масНазвУслуг!и - тут названия
масИдУслуг!и - тут ид
масСумУслуг!и - тут суммы

Хотел как бы так
Мас[ид]"назв"
Мас[ид]"ид"
.....
Мас[ид]"сум"
все необходимые свойства коллекции , ну или массив объектов что ли... нет такой возможности?
__________________
Владимир из Владимира http://gcpo.ru
Группа дилеров ИП в телеграмм https://t.me/+F-Axt4OtaqNlOGZi - присоединяйтесь по заявке

Группа пользователей ИП в телеграмм - https://t.me/infopredp
Ответить с цитированием
  #2  
Старый 03.10.2014, 14:42
Аватар для GriAlex
GriAlex GriAlex вне форума
Кен-ГурУ :-)
 
Регистрация: 28.01.2008
Адрес: Чувашия
Сообщений: 13,235
По умолчанию

Цитата:
Сообщение от kaetank Посмотреть сообщение
...
Ну и как бы повыяснять насчет многомерных массивов - коллекций данных? нет такой возможности? а то приходится плодить кучу одномерных массивов - в каждом своя "данная"
типа
масНазвУслуг!и - тут названия
масИдУслуг!и - тут ид
масСумУслуг!и - тут суммы

Хотел как бы так
Мас[ид]"назв"
Мас[ид]"ид"
.....
Мас[ид]"сум"
все необходимые свойства коллекции , ну или массив объектов что ли... нет такой возможности?
Ну так для последнего стройте составной индекс типа [инд1 + РР + инд2 + РР + инд3 + РР + инд4], где РР - это спецразделитель.
А возможности обработки массивов с такими индексами есть разные. И по маске классно работает, и СЛОВО(номер_слова, инд, РР) выделяется.

Для вашего случая по маске хорошо работать.
Задайте только индекс так: Мас["назв" + РР + СТР(ид)], Мас["сум" + РР + СТР(ид)]

А потом читайте в цикле:

ЦИКЛ ДЛЯ (инд ИЗ Мас, "назв*") - выбираются названия, т.е. берутся все индексы, которые "начинаются" с набора букв "назв".
или
ЦИКЛ ДЛЯ (инд ИЗ Мас, "сум*") - выбираются суммы

Кстати, можно строить индекс по-всякому, так тоже сработает:
[СТР(ид) + РР + "назв"] и
ЦИКЛ ДЛЯ (инд ИЗ Мас, "*назв*")
маску можно строить и так: "назв" + РР + "*" и т.п.
Попробуйте, поэкспериментируйте. Мне нравится.

//===============

А для передачи массивов всегда использовал и глобальные переменные и неглобальные. Опять же создаем библиотеку, например, DLYA_PEREM.LIB, в ней описываем наши ПЕРЕМ и т.п.(т.е. только описание общих переменных). А потом везде в своем коде эту библиотеку подключаем. Если без ГЛОБАЛ, то всё опять же замечательно работает в профиле пользователя (в его текущем сеансе).
__________________


Сайт - Вконтакте - Telegram - Skype - YouTube

Последний раз редактировалось GriAlex, 03.10.2014 в 20:52.
Ответить с цитированием
  #3  
Старый 03.10.2014, 15:33
Аватар для Григорий
Григорий Григорий вне форума
Отвечатель автоматический
 
Регистрация: 08.12.2007
Адрес: Москва
Сообщений: 18,829
По умолчанию

Цитата:
Сообщение от kaetank Посмотреть сообщение

Как вернуть массив из функции? или только через глобальные переменные?
типа

Можно через параметры-переменные, пример:

Код:
ФУНКЦИЯ ШРИФТ РазбитьНаСтроки(СТРОКА: стр; ЧИСЛО: ширина; ПЕРЕМ СТРОКА: массив_строк[])
  стр = стр + "."
  позиция = 1
  а = 1
  наличие_переноса = НЕТ
  кол_пробелов = 0
  слово = ""
  новая_позиция = 1
 
  ЦИКЛ ДЛЯ (и = 1, ДЛИНА(стр))
    ЕСЛИ ПОДСТР (стр, и, 1) ИЗ [" ",  ",",  "."]  ТО
      слово = ПОДСТР(стр, позиция, и - позиция + 1)
      ширина_слова = ШИРИНА_СТРОКИ(слово)
      кол_пробелов = кол_пробелов + 1
 
      ЕСЛИ (ширина_слова > ширина) ТО
        ЕСЛИ (кол_пробелов = 1) ТО
          массив_строк!а = слово
          а++
          кол_пробелов = 0
          позиция = и + 1
        ИНАЧЕ
          а++
          наличие_переноса = ДА
          массив_строк!а = ПОДСТР(стр, новая_позиция, и - новая_позиция + 1)
        КОНЕЦ_ЕСЛИ
      ИНАЧЕ
        массив_строк!а = слово
      КОНЕЦ_ЕСЛИ
 
      ЕСЛИ наличие_переноса ТО
        наличие_переноса = НЕТ
        позиция = новая_позиция
      КОНЕЦ_ЕСЛИ
      новая_позиция = и + 1
    КОНЕЦ_ЕСЛИ
  КОНЕЦ_ЦИКЛА
 
  массив_строк!а = ПОДСТР(массив_строк!а, 1, ДЛИНА(массив_строк!а)-1)
КОНЕЦ_ФУНКЦИИ
Ответить с цитированием
  #4  
Старый 03.10.2014, 15:48
Аватар для GriAlex
GriAlex GriAlex вне форума
Кен-ГурУ :-)
 
Регистрация: 28.01.2008
Адрес: Чувашия
Сообщений: 13,235
По умолчанию

Цитата:
Сообщение от Григорий Посмотреть сообщение
Можно через параметры-переменные, пример:

ФУНКЦИЯ ШРИФТ РазбитьНаСтроки(СТРОКА: стр; ЧИСЛО: ширина; ПЕРЕМ СТРОКА: массив_строк[])
...
А вот массивы в параметрах-переменных описывать ещё не пробовал. Оказывается, можно. Хорошо.
__________________


Сайт - Вконтакте - Telegram - Skype - YouTube
Ответить с цитированием
  #5  
Старый 03.10.2014, 15:59
Писарев Петр Писарев Петр вне форума
Гуру
 
Регистрация: 22.01.2008
Адрес: Ростов-на-Дону
Сообщений: 11,262
По умолчанию

Меня тоже это заинтересовало, попробую
Ответить с цитированием
  #6  
Старый 17.12.2014, 02:33
Аватар для kaetank
kaetank kaetank вне форума
Форумчанин
 
Регистрация: 24.07.2009
Адрес: г. Владимир
Сообщений: 360
По умолчанию

Апну темку.

Есть ли возможность вставить значение в массив не в конец? то есть не дописать а вставить или только через перезапись?
__________________
Владимир из Владимира http://gcpo.ru
Группа дилеров ИП в телеграмм https://t.me/+F-Axt4OtaqNlOGZi - присоединяйтесь по заявке

Группа пользователей ИП в телеграмм - https://t.me/infopredp
Ответить с цитированием
  #7  
Старый 17.12.2014, 03:57
Писарев Петр Писарев Петр вне форума
Гуру
 
Регистрация: 22.01.2008
Адрес: Ростов-на-Дону
Сообщений: 11,262
По умолчанию

Так все зависит от ИНДЕКСА, какой поставим - там и будет стоять значение.
Ответить с цитированием
  #8  
Старый 17.12.2014, 04:31
Михаил,Тверь Михаил,Тверь вне форума
Гуру
 
Регистрация: 21.01.2008
Адрес: Тверь
Сообщений: 4,303
По умолчанию

Дополню. В ИП2 индексом массива может быть любая строка. Если задается числовой индекс, он преобразуется в строку. В конструкции ЦИКЛ ДЛЯ ( * ИЗ *) массив перебирается в алфавитном порядке индексов, так что как раз добавление элемента в конец массива - "очень частный случай".
Ответить с цитированием
  #9  
Старый 25.12.2014, 04:44
Писарев Петр Писарев Петр вне форума
Гуру
 
Регистрация: 22.01.2008
Адрес: Ростов-на-Дону
Сообщений: 11,262
По умолчанию

А каким образом передать массив в функцию?
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод строки vlad Бухгалтерия 2 04.04.2014 11:07
Массив записей журнала Михаил,Тверь Общий 1 27.01.2014 16:25


Часовой пояс GMT +4, время: 17:52.


vBulletin® Version 3.6.8.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot
© 1999 Новасофт