вывести номер искомого элемента массива

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Приветствую всех !
Элементарная задача - не знаю как решить:

Есть, например, массив данных:
:local list [:toarray "mama, papa, brat, sestra"];

Проверить элемент на вхождение в массив можно так:

:local Type "brat";
:foreach i in=$list do={ :if ($i=$Type) do={:log info "yes" } else={:log info "no";}

А как получить порядковый номер этого элемента в массиве ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Ну так что никто не знает ? Наверняка просто же ? Может перебрать массив каким другим видом цикла ?
Если кто знает - подскажите, пожалуйста ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Дело в том что в случае с циклом "foreach i in=" в $i находится сам элемент массива, а не счетчик прохода по циклу. А где счетчик то хранитcя ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Пока ждал ответа от кого-нибудь придумал другой выход. Создается массив этих элементов с ключами-номерами к ним. Вот и все.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
vqd
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

Sertik писал(а):Приветствую всех !
Элементарная задача - не знаю как решить:

Есть, например, массив данных:
:local list [:toarray "mama, papa, brat, sestra"];

Проверить элемент на вхождение в массив можно так:

:local Tipe "brat";
:foreach i in=$list do={ :if ($i=$Type) do={:log info "yes" } else={:log info "no";}

А как получить порядковый номер этого элемента в массиве ?


:global list [:toarray "mama, papa, brat, sestra"];

Без циклов проверяем вхождение
:if ([:len [find key=brat in=$list ]] > 0) do={:put "Yes"} else={:put "No"}

Собственно позиция
:put [find key=brat in=$list ]


Есть интересная задача и бюджет? http://mikrotik.site
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

vqd, спасибо, большое !

Тогда уж еще вопрос к Вам, как к гуру:

Как удалить элемент из массива - не обнулить его значение, а именно удалить вместе с ключом ?

И еще вопрос - откуда Вы это знаете ? (если не секрет, конечно). Существуют ли фирменные руководства по скриптовому языку Микротик, кроме Вики ?
Можете посоветовать источник ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Код: Выделить всё

{
:local list [:toarray "mama, papa, brat, sestra"];
:set list ([:pick $list 0 2] , nil , [:pick $list 3 4]);
:put $list;
}


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

podarok66: как у Вас можно, но криво как то. Нужно знать позицию элемента в массиве и придется от нее pick-ать элементы. Должно быть изящнее ...
Но все равно, спасибо ! Решение рабочее.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Вот так, с помощью vqd и podarok66, получилось вроде универсально:
Из массива удаляется заданный элемент. Правда, верятно, если он в массиве не повторяется.

{
:local name "brat"
:local list [:toarray "mama, papa, brat, sestra"];
:local keynum [:find key=$name in=$list]
:put $list
:set list ([:pick $list 0 [:find key=$name in=$list]] , nil , [:pick $list ([:find key=$name in=$list]+1) [:len $list]]);
:put $list;
}

Еще проверю во всех вариантах. Спасибо, друзья !


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Sertik писал(а):Правда, верятно, если он в массиве не повторяется.

Если есть повтор, то удаляет первый из попавшихся:

Код: Выделить всё

{
:local list [:toarray "mama, papa, brat, sestra, brat"];
:local y [:len $list];                                   
:local key [:find key=brat in=$list];
:put $list;                           
:set list ([:pick $list 0 $key], nil , [:pick $list ($key + 1) $y]);
:put $list;                                                         
}         
mama;papa;brat;sestra;brat
mama;papa;sestra;brat

Тогда уж надо для удаления повторяющегося значения использовать такую связку:

Код: Выделить всё

{
:local list [:toarray "mama, papa, brat, sestra, brat"];
:put $list;                                   
:foreach i in=$list do={
:if ($i="brat") do={
:local y [:len $list];
:local key [:find key=brat in=$list];                                                     
:set list ([:pick $list 0 $key], nil , [:pick $list ($key + 1) $y]);
:put $list;}}
}     
mama;papa;brat;sestra;brat
mama;papa;sestra;brat
mama;papa;sestra                                                     

Что по поводу некрасивости моей первой конструкции, так я же вам направление решения показал, а не задачу решал в окончательном варианте...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить