我已经编写了这个脚本来用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
)
)
您是否正在尝试按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'
那样具有任意键 - 它只接受括号中的数字。您必须修改此代码以将总计保存在不同的结构中)
同样,在每种情况下,总结每笔付款的'p2'
'p1'
最大值的更惯用的方法可能看起来更像这样:
totals = cases.values.map do |c|
c.inject(0) { |sum, payment| sum + [payment['p1'], payment['p2']].max }
end