I’m trying to get a flattened array of children (down to a certain

depth) of a folder (which is using acts_as_tree).

def recursive_find_depth(depth)

if self.children.length > 0 and depth != 0

self.children.each do |child|

puts child.name

child.recursive_find_depth(depth -= 1)

end

end

end

At the moment, the function ‘puts’ the right output, i.e. all the

children under a certain folder to a certain depth. However, I

completely stuck about how to get the finished array of children out of

this function (this shouldn’t be hierarchal, just a flattened array). If

anyone’s wondering what I’m using this for - it’s a webdav system

(PROPFIND). Thanks in advance

Richard Inham wrote:

I’m trying to get a flattened array of children (down to a certain

depth) of a folder (which is using acts_as_tree).

def recursive_find_depth(depth)

if self.children.length > 0 and depth != 0

self.children.each do |child|

puts child.name

child.recursive_find_depth(depth -= 1)

end

end

end

At the moment, the function ‘puts’ the right output, i.e. all the

children under a certain folder to a certain depth. However, I

completely stuck about how to get the finished array of children out of

this function (this shouldn’t be hierarchal, just a flattened array). If

anyone’s wondering what I’m using this for - it’s a webdav system

(PROPFIND). Thanks in advance

Will the Ruby Array.flatten method do what you’re after?

http://www.rubycentral.com/ref/ref_c_array.html#flatten

c.

Cayce B. wrote:

Richard Inham wrote:

I’m trying to get a flattened array of children (down to a certain

depth) of a folder (which is using acts_as_tree).

def recursive_find_depth(depth)

if self.children.length > 0 and depth != 0

self.children.each do |child|

puts child.name

child.recursive_find_depth(depth -= 1)

end

end

end

At the moment, the function ‘puts’ the right output, i.e. all the

children under a certain folder to a certain depth. However, I

completely stuck about how to get the finished array of children out of

this function (this shouldn’t be hierarchal, just a flattened array). If

anyone’s wondering what I’m using this for - it’s a webdav system

(PROPFIND). Thanks in advance

Will the Ruby Array.flatten method do what you’re after?

http://www.rubycentral.com/ref/ref_c_array.html#flatten

c.

def recursive_find_depth(depth)

if self.children.length > 0 and depth != 0

child_array ||= []

self.children.each do |child|

child_array << child

puts child_array.join(’ ,')

child.recursive_find_depth(depth -= 1)

end

return child_array

end

end

Nope. The function above returns the first folder, but not ‘child_array’

(although it ‘puts’ it fine).

Hi –

On Thu, 16 Nov 2006, Richard Inham wrote:

end

end

At the moment, the function ‘puts’ the right output, i.e. all the

children under a certain folder to a certain depth. However, I

completely stuck about how to get the finished array of children out of

this function (this shouldn’t be hierarchal, just a flattened array). If

anyone’s wondering what I’m using this for - it’s a webdav system

(PROPFIND). Thanks in advance

This is untested, but hopefully will either work or give you some

ideas:

def recursive_find_depth(depth, list=[])

unless depth.zero?

children.each do |child|

list.push(child.name)

child.recursive_find_depth(depth-1, list)

end

end

list

end

David

–

David A. Black | [email protected]

Author of “Ruby for Rails” [1] | Ruby/Rails training & consultancy [3]

DABlog (DAB’s Weblog) [2] | Co-director, Ruby Central, Inc. [4]

[1] Ruby for Rails | [3] http://www.rubypowerandlight.com

[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

This is untested, but hopefully will either work or give you some

ideas:

Thanks David, works fine!

On 16 November 2006 17:06, Richard Inham wrote:

```
end
```

Will the Ruby Array.flatten method do what you’re after?

puts child_array.join(’ ,’)

child.recursive_find_depth(depth -= 1)

end

return child_array

end

end

Nope. The function above returns the first folder, but not ‘child_array’

(although it ‘puts’ it fine).

def nflatten(depth, result = [])

return [] if depth <= 0

self.inject([]) { |result, item| result << item << nflatten(depth-1,

item);

result }

end