Уроки Tcl

Начало Уроки Tk Файлы
Статьи Уроки Tcl Гостевая книга
Предыдущий урок - #22: Ассоциативный массив - array

#23: Перебор значений массива

Есть два способа перебора значений ассоциативного массива.

Цикл 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"
	}
}

Следующий урок - #24: Работа с файлами
Горбачев "Yurez" Юрий  
Хостинг от uCoz