Уроки Tcl
#23: Перебор значений массива
|
Есть два способа перебора значений ассоциативного массива.
- Используя цикл foreach и результат команды array names
- Используя команду array startsearch
Цикл foreach проще, однако, если код для перебора распределён между
несколькими процедурами, то лучше использовать array startsearch,
array nextelement, и т.д.
array startsearch имяМассива |
| Подготавливает имяМассива
для перебора значений, и возвращает ключПеребора, который
потом надо передавать другим командам.
На одном массиве одновременно могут идти несколько переборов,
для каждого будет уникальный ключПеребора |
array nextelement имяМассива ключПеребора |
| Возвращает индекс следующего элемента
в имяМассива. Если в массиве больше нет элементов, возвращается пустая строка. |
array anymore имяМассива ключПоиска |
| Возвращает 1 если есть элементы для перебора
командой array nextelement. В противном случае возвращается 0. |
array donesearch имяМассива ключПоиска |
| Уничтожает хранимую информацию о переборе.
Это команда должна выполняться когда перебор завершается. |
Помните, что если вы добавляете или удаляете элементы
массива во время перебора, то перебор прекращается.
После таких изменений массива array nextelement возвратит пустую строку
и array anymore возвратит ноль.
Пример:
array set array1 [list \
{123} {Александр Антуфьев} \
{234} {Борис Бобров} \
{345} {Валерий Воронов} \
{456} {Григорий Горбачев} ]
;#
;# Простой перебор по массиву в цикле foreach
;#
foreach id [array names array1] {
puts "$array1($id) ячейка с индексом: $id"
}
;#
;# Две процедуры перебора по одному массиву
;#
proc getrec_format1 {arrayVar searchid} {
global $arrayVar
upvar $searchid id
set record [array nextelement $arrayVar $id];
return "Текущий индекс: $record"
}
proc getrec_format2 {arrayVar searchid} {
global $arrayVar
upvar $searchid id
set record [array nextelement $arrayVar $id];
return "Текущий индекс: $record"
}
set searchId [array startsearch array1];
puts ""
set item 0;
while {[array anymore array1 $searchId]} {
incr item;
if {[expr $item %2]} {
set format1 [getrec_format1 array1 searchId]
puts "Элемент номер: $item перебор 1: $format1"
} else {
set format2 [getrec_format2 array1 searchId]
puts "Элемент номер: $item перебор 2: $format2"
}
}
|