Sometimes, if you have large arrays, it is better to not use '''[foreach]''' and '''[array] get''' to loop through an array, as it creates a list copy of your array with a quite hefty memory cost: foreach {key value} [array get arrName] {#do something with key and value} Another alternative is foreach key [array names arrName]] { #get current value with $arrName($key) } foreach key [lsort -dictionary [array names foo]] { ... } Better do it like this, using '''[while]''' and the '''[array]''' search facilities. (Those are a direct mapping of the C level functionality for a Tcl_HashTable ). set searchToken [array startsearch largeArray] while {[array anymore largeArray $searchToken]} { set key [array nextelement largeArray $searchToken] set value $largeArray($key) # do something with key/value } array donesearch largeArray $searchToken Question: how big does an array need to be to make this the better approach?