Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Удалить переменную из массива / Удалить элемент из массива

    Удалить переменную из массива / Удалить элемент из массива

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Удалить переменную из массива / Удалить элемент из массива, RouterOS
     
    rftnon
    Guest
    #1
    0
    09.03.2016 10:32:00
    Код: :global aaa ([:toarray "jan,feb,mar,apr"]); хочу удалить переменную "mar" из массива aaa. Вывод: "aaa"={"jan,feb,apr"}???
     
     
     
    alli
    Guest
    #2
    0
    13.06.2018 01:17:00
    Вызов :set для переменных или элементов массива без указания значения, кажется, работает как unset (v6.42.3), проверьте это:

    :global a {b=1}
    /environment print
    :set ($a->"b")
    /environment print
    :set $a
    /environment print
     
     
     
    Retral
    Guest
    #3
    0
    13.06.2020 16:09:00
    Большое спасибо вам за это, сэр. Вы правы. Думаю, где у других могут возникнуть сложности — это при работе с массивами без явного определения ключей. Если вы попробуете это на массивах с заранее заданными числовыми ключами, то удалить можно только значение ключа, но не сам ключ. Например: :global a {"val1";"val2";"val3"} — я понимаю, что здесь ключи не указаны, но RouterOS назначает этим значениям числовые ключи, начиная с 0. Иногда так проще для некоторых моих задач.

    /environment print  
    :set ($a->0) — это стирает значение ключа, но не сам ключ, тогда как ваш способ удаляет элемент по ключу, что мне и было нужно вчера вечером, так что ещё раз спасибо ;)

    /environment print  
    :set $a  
    /environment print
     
     
     
    Jotne
    Guest
    #4
    0
    13.06.2020 19:54:00
    Удалить "mar" из массива "aaa"

    Пройтись по массиву и отправить в новый массив всё, кроме "mar":

    :local delete "mar"  
    :local array [:toarray ""]
    :local aaa ([:toarray "jan,feb,mar,apr"])
    :foreach i in=$aaa do={  
    :if ( $i!=$delete ) do={  
    :set array ( $array, $i )  
    }  
    }  
    :set aaa $array  
    :put $aaa  

    Возможно, есть более простой способ это сделать…
     
     
     
    Railander
    Guest
    #5
    0
    30.08.2022 07:43:00
    Я пытался это сделать и был очень расстроен тем, что в скриптинге можно добавить элементы в массив, но нельзя найти и удалить элемент из массива. После долгих поисков я нашёл обходной путь — преобразовать массив в строку и выполнить регулярное выражение по ней.

    :local array1String (";".[:tostr $array1].";")
    :foreach arrayElement in=[$array2] do={
    :if ($arrayString~";+$arrayElement;+") do={ действие для совпавших элементов здесь }  
    else={ действие для не совпавших элементов здесь } }
     
     
     
    rextended
    Guest
    #6
    0
    30.08.2022 08:05:00
    Этот «обходной путь» — полная ерунда и полный набор ошибок, некоторые вещи исправляют другие неправильно сделанные вещи… Ты опять прав.
     
     
     
    rextended
    Guest
    #7
    0
    30.08.2022 08:06:00
    Название этой темы было «i want remove variable in array», я изменил его на «Remove variable in array / Remove item in array» для удобства поиска и ссылки. Вот точная процедура, как уже писал в одном из предыдущих постов.

    Новый пример удаления одной переменной, определённой внутри массива:
    {
    :local test {"a"=1;"b"=2;"c"=3}
    :put $test
    :set ($test->"b")
    :put $test
    }

    Для удаления одного ЭЛЕМЕНТА внутри массива это очень просто, если понять, как работать с массивами:
    {
    :local test {"bb";"dddd";"a";"ccc"}
    :put $test
    :local arrlen [:len $test]
    :local arrpos [:find $test "dddd" -1]
    :set test ([:pick $test 0 $arrpos],[:pick $test ($arrpos + 1) $arrlen])
    :put $test
    }

    Очевидно, если нужно удалить все ЭЛЕМЕНТЫ, начиная с определённого, заканчивая или содержащие конкретную строку, нужно использовать цикл. Но для удаления одного точного элемента предыдущая процедура — самая быстрая. В следующем посте добавлю пример удаления нескольких элементов по RegEx или строке.
     
     
     
    Railander
    Guest
    #8
    0
    30.08.2022 08:22:00
    @rextended, мой пример работает, так что, наверное, ты просто неправильно посмотрел. Мне пришлось добавить «;» в начало и конец массива, чтобы использовать их как разделители и избежать нежелательных совпадений (например, чтобы 10.0.0.1 не совпадал с 110.0.0.145 и так далее). Но мне было бы интересно узнать, что именно в нём не так. В моём случае мне нужно было сравнивать элементы одного динамического массива с элементами другого, а не просто выбирать какой-то один элемент, имя или позицию которого я уже знаю. Даже глядя на твои примеры, я всё равно считаю их недостаточными. Первый использует key,value, что требует сопоставления значения, а потом уже действий с ключом. Второй опирается на длину массива, то есть нужно сначала найти позицию элемента, а потом уже что-то с ней делать (к тому же он не работает с вложенными массивами).
     
     
     
    rextended
    Guest
    #9
    0
    30.08.2022 08:28:00
    Это всего лишь примеры, чтобы создавать более сложные функции. Если вы не приводите хорошие примеры или подробное описание, а просто общий хаос, я (и другие) не сможем понять, что именно вы хотите…

    Например, удалить элемент(ы) из массива, которые совпадают с RegEx или частичной/полной строкой. В этом случае удаляются все элементы массива, содержащие «c»:

    {
    :local test   {"bb";"dddd";"a";"ccc";"abcd";"befgh"}
    :local search "c" ; # может быть простой строкой или RegEx

    :put $test
    :local arrlen [:len $test]
    :local arrpos

    :foreach item in=$test do={
       :if ($item ~ $search) do={
           :set arrpos [:find $test $item -1]
           :set test ([:pick $test 0 $arrpos],[:pick $test ($arrpos + 1) $arrlen])
       }
    }

    :if ([:typeof $arrpos] = "nothing") do={ :put "Ничего не заменено, $search не найдено" }

    :put $test
    }
     
     
     
    Railander
    Guest
    #10
    0
    30.08.2022 08:42:00
    Мой кейс был в том, чтобы добавить каждый интерфейс в список интерфейсов, кроме тех, которые уже там есть.

    :local intf [:toarray ""]
    :foreach i in=[/interface/find] do={
    :set intf ($intf,[/interface/get $i name])
    }

    :local list [:toarray ""]
    :foreach l in=[/interface/list/member/find where list=list1] do={
    :set list ($list,[/interface/list/member/get $l interface])
    }

    :local listStr (";".[:tostr $list].";")

    :foreach i in=[$intf] do={
    :if ($listStr~";+$i;+") do={} else={/interface/list/member/add list=list1 interface=$i disabled=yes}
    }

    Гораздо проще, если честно, на мой взгляд (я просто вручную поправил имена переменных, так что могут быть опечатки, но могу подтвердить, что работает как надо, потому что списки интерфейсов позволяют создавать дубликаты, а этот скрипт не создаёт дубликаты).
     
     
     
    rextended
    Guest
    #11
    0
    30.08.2022 08:49:00
    Редизайн кода в этом посте https://forum.mikrotik.com/viewtopic.php?p=954302#p954280, без изменения функционала, для лучшего чтения и понимания:

    :local array1String ";$[:tostr $array1];"

    :foreach arrayElement in=$array2 do={
       :if ($arrayString~";+$arrayElement;+") do={
    # действие, которое нужно выполнить при совпадении
       } else={
    # действие, которое нужно выполнить, если совпадения нет
       }
    }

    Первый массив преобразуется в строку, при этом лишне добавляя «;» в начале и в конце, потом элементы второго массива используются как слова для поиска, но перед этим к ним добавляется «;» с «+» впереди, хотя «;» там уже есть, а «+» вообще ни к чему. А дальше вообще ничего не происходит, кроме комментариев… Тут я не вижу никакого «решения» для удаления элемента внутри массива.
     
     
     
    rextended
    Guest
    #12
    0
    30.08.2022 08:54:00
    Минутку, дайте мне время прочитать. Но пока один вопрос. Учитывая это, интересно, как им удаётся менять количество интерфейсов, если только они не виртуальные, ведь в этом конкретном случае уже не так просто напрямую создать новый список интерфейсов, заменив содержимое предыдущего массива на новый, который уже уникален? Это размышление основано на том, как вы описали его использование.
     
     
     
    Railander
    Guest
    #13
    0
    30.08.2022 09:00:00
    Мне больше нравится короткий способ преобразования в строку, спасибо. Не знаю, зачем я добавил плюс к регулярному выражению, к тому моменту я уже долго возился и просто пробовал максимально универсальные варианты. Но вот что важно — нужно добавлять точку с запятой в начале и в конце массива, чтобы использовать их как разделители, иначе, если искать 10.0.0.1, можно случайно найти 10.0.0.123 в {1;2;3;10.0.0.123}. А если искать ;10.0.0.1;, то ничего не найдёшь, потому что совпадение будет в конце массива без завершающей точки с запятой.
     
     
     
    Railander
    Guest
    #14
    0
    30.08.2022 09:03:00
    Думаю, твое альтернативное решение с созданием отдельного списка вызвало бы у меня проблемы, потому что я использую этот список интерфейсов в OSPF interface-templates. Мне кажется, любое изменение приведет к сбоям во всех интерфейсах. Именно поэтому я решил сделать такую проверку.
     
     
     
    rextended
    Guest
    #15
    0
    30.08.2022 09:08:00
    Правильная поисковая строка — “(^|;)10.0.0.1(;|$)” — то есть должна быть либо точка с запятой в начале или в конце, либо это начало или конец строки.
     
     
     
    rextended
    Guest
    #16
    0
    30.08.2022 09:09:00
    Для меня вы используете массив без всякой причины, вот решение (в примере list1 должен уже существовать). Меньше кода, без массива.  
    /interface  
    :foreach i in=[find] do={
       :local iname [get $i name]
       :if ([:len [list member find where list=list1 and interface=$iname]] = 0) do={
           list member add list=list1 interface=$iname disabled=yes  
       }  
    }
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры