Rubyで、複数の配列から同時進行でeachしたいって時には、.zipが使えます。
fruits = ['apple','banana', 'grape', 'orange']
vegetables = ['carrot','radish', 'leaf', 'letus']
pg = ['hoge','fuga', 'foo', 'bar']
fruits.zip(vegetables).each {|fruit , vegetable|
# print(fruit)
# print(vegetable)
}
// 3つ以上ある場合はこういうやり方が便利。
fruits.zip(vegetables, pg).each {|fruit , vegetable , pg|
puts(fruit)
puts(vegetable)
puts(pg)
}
__END__
#=>
apple
carrot
hoge
banana
radish
fuga
grape
leaf
foo
orange
letus
bar
例えば、「Xpathスクレイピングしたのを、同時にeachで回してCSV形式にしたいなぁ…」と思ったら、
こうやってしまうと、変なことになります。
p html.xpath('//*[@class="promotion"]/div[1]/div[1]/h5[1]').each{|i|
html.xpath('//*[@class="promotion"]/div[1]/div[1]/h5[2]').each{|l|
puts i.text + ',' + l.text
}
}
今回紹介したzipメソッドを使って、こう書くのが正解です。
p html.xpath('//*[@class="promotion"]/div[1]/div[1]/h5[1]').zip(html.xpath('//*[@class="promotion"]/div[1]/div[1]/h5[2]')).each{|c_name, p_name|
puts c_name.text + ',' + p_name.text
}