尝试将一些旧的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
我认为这是一个简单的语法问题,但我的谷歌搜索结果是空的。谢谢你的帮助!
答案 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)
。