我写过这个脚本是用PHP运行的,我试图将它转换为Ruby。
代码:
$cases = array();
foreach($results as $result)
{
if(!array_key_exists($result['id'], $cases))
$cases[$result['id']] = array($result);
else
$cases[$result['id']][] = $result;
}
foreach($cases as $key => $case)
{
foreach($case as $payment)
{
if(count($case) > 1)
{
$cases[$key]['total'] += ($payment['p1'] > $payment['p2']) ? $payment['p1'] : $payment['p2'];
} else {
$cases[$key]['total'] = ($payment['p1'] > $payment['p2']) ? $payment['p1'] : $payment['p2'];
}
}
}
在Ruby中,我将结果作为MySQL返回的数组(使用mysql2
gem)。使用下面的循环,它打印每一行。如何在不提供密钥时检查密钥是否存在?
在Ruby中实现此代码的最佳方法是什么?如何在Ruby中的哈希上添加哈希,类似于在PHP中将数组添加到数组中。
results.each(:as => :array) do |row|
puts row.inspect
end
更多解释:
PHP结构
Array(
0 => Array(
Array(
[id] => 'random id',
[p1] => 534,
[p2] => 105
),
Array(
[id] => 'random id',
[p1] => 335,
[p2] => 425
)
),
1 => Array(
Array(
[id] => 'random id',
[p1] => 259,
[p2] => 124
)
)
)
我正在尝试迭代第一个内部的每个数组,如果p1> p2,将p1添加到该阵列上的总键。即0指数看起来像这样:
0 => Array(
'total' => 959,
Array(
[id] => 'random id',
[p1] => 534,
[p2] => 105
),
Array(
[id] => 'random id',
[p1] => 335,
[p2] => 425
)
)
答案 0 :(得分:1)
您是否尝试按result['id']
进行分组?我相信将您的PHP代码“翻译”为ruby将会是这样的:
cases = {}
results.each do |result|
if cases[result['id']]
cases[result['id']] << result
else
cases[result['id']] = [result]
end
end
获得相同结果的另一种方法是使用group_by
:
cases = results.group_by { |result| result['id'] }
“翻译”到ruby的第二部分看起来像这样:
cases.each do |key, c|
c.each do |payment|
if c.count > 1
c['total'] += (payment['p1'] > payment['p2']) ? payment['p1'] : payment['p2']
else
c['total'] = (payment['p1'] > payment['p2']) ? payment['p1'] : payment['p2']
end
end
end
(这实际上不适用于ruby,因为数组不能有'total'
这样的任意键 - 它只接受括号中的数字。你必须修改这段代码才能将总数保存在不同的结构中)
同样,在每种情况下,总结每笔付款的'p1'
和'p2'
之间的最大值的惯用方法可能更像是这样:
totals = cases.values.map do |c|
c.inject(0) { |sum, payment| sum + [payment['p1'], payment['p2']].max }
end