在Ruby中循环并创建一个数组

时间:2011-01-15 22:17:42

标签: ruby

尝试将一些旧的PHP代码移植到Ruby,并缺少关于在Ruby中创建数组的一些关键信息。

PHP代码:

foreach ($results as $r) {
    $array[$r['column']][] = $r
}

这是在Ruby中最简单的方法吗?我是否必须初始化第二个数组?

@array = []
result.each do |r|
  @array[r.cron_column] = []
  @array[r.cron_column] << r
end

我认为这是一个简单的语法问题,但我的谷歌搜索结果是空的。谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

您正在索引到一个空数组,因此它将始终返回nil。 nil没有定义&lt;&lt;运算符,所以你得到一个错误。如果要使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;操作

我假设你想要一个数组数组,所以你可以使用它来代替它将items [index]的值初始化为空数组(如果它是nil,然后将值推到它上面)

items = []
array.each do |r|
  (items[r.column] ||= []) << r
end

这里唯一的变化是,如果items [r.column]返回nil,则将其设置为等于空数组,否则不会执行任何操作。如果您真的只想将items [index]的值设置为r,只需使用=运算符即可。

答案 1 :(得分:0)

array = results.inject([]) { |m, r| m[r.column] = r; m }

更新:哦,e1[] = e2在PHP中添加了一个新的数组元素,因此tokland是正确的,在这种情况下:

array = results.inject([]) { |m, r| (m[r.column] ||= []) << r; m }

答案 2 :(得分:0)

您确定需要数组作为输出吗?哈希会更方便;而且,在您的场景中构建更容易(这通常表明您处于正确的路径中):

# example
results = [
  OpenStruct.new(:x => 1, :cron_column => 0), 
  OpenStruct.new(:x => 2, :cron_column => 1), 
  OpenStruct.new(:x => 3, :cron_column => 1),
] 

@array = results.group_by(&:cron_column)
# {0=>[#<OpenStruct x=1, cron_column=0>], 
#  1=>[#<OpenStruct x=2, cron_column=1>, #<OpenStruct x=3, cron_column=1>]}

如果cron_column“没有漏洞”(就是它,你有从0到N的值),你可以根据自己的喜好轻松创建一个具有相同想法的数组:results.group_by(&:cron_column).sort.map { |k, v| v }results.group_by(&:cron_column).sort.map(&:last)