Extracting all subarray indices from a multi-dimensional array
Example: ar = []; x = ar.fetch(5, []) returns an empty array for non-existing index 5.
class Array def subar_indices(ar=[], temp=[]) temp = temp.dup self.each_with_index { |item, index| if item.class == Array temp << index ar << temp ar = item.subar_indices(ar, temp) end } ar.uniq end def extract_subar_indices subarray_indices = self.subar_indices # subarray_indices is a two-dimensional array # puts subarray_indices.inspect return subarray_indices if subarray_indices.empty? first_subar = subarray_indices.shift # the first subarray contains all two-dimensional subarray indices subarray_indices.each do |subar| subar_size = subar.size str = "" count = -1 (subar_size - 1).times { count += 1; str << ".fetch(subar[#{count}], [])" } str << ".fetch(subar[#{count + 1}], {}" str = "self" << str if eval(str).class == Hash then subar.shift; redo end end first_subar.reverse.each do |item| subarray_indices.unshift([item]) end subarray_indices end end array = [1, 2, [3, 4, [5, 6]], 7, 8, [9]] indices = array.extract_subar_indices puts indices.inspect # [[2], [5], [2, 2]]