关联数组(或哈希)php到ruby

时间:2011-04-25 20:12:07

标签: ruby arrays hash associative-array

我对ruby比较新,我来自php。似乎我不理解的一件事是哈希和数组之间的区别。 你如何在ruby中实现关联数组? 例如

$albums = array();
$songs = array();
$songs[] = array('title' => 'Title 1', 'artist' => 'Artist 1', 'album' => 'Album 1');
$songs[] = array('title' => 'Title 2', 'artist' => 'Artist 2', 'album' => 'Album 2');
$songs[] = array('title' => 'Title 3', 'artist' => 'Artist 1', 'album' => 'Album 1');
$songs[] = array('title' => 'Title 4', 'artist' => 'Artist 1', 'album' => 'Album 1');
$songs[] = array('title' => 'Title 5', 'artist' => 'Artist 3', 'album' => 'Album 1');
foreach($songs as $song)
{
  if( !isset($albums[$song['album']]) ) $albums[$song['album']] = array();
  $albums[$song['album']]['title'] = $song['album'];
  $albums[$song['album']]['songs'] = $song;
}
print_r($albums);
['Album 1']
  => 'title' => 'Album 1'
  => 'songs'
    => 'title' => 'Title 1', 'artist' => 'Artist 1', 'album' => 'Album 1'
    => 'title' => 'Title 3', 'artist' => 'Artist 1', 'album' => 'Album 1'
    => 'title' => 'Title 4', 'artist' => 'Artist 1', 'album' => 'Album 1'
    => 'title' => 'Title 5', 'artist' => 'Artist 3', 'album' => 'Album 1'
['Album 2']
  => 'title' => 'Album 2'
  => 'songs'
    => 'title' => 'Title 1', 'artist' => 'Artist 1', 'album' => 'Album 1'

甚至,我可以用标题,艺术家和多少首歌声明一个数组专辑信息,而不是标题和歌曲。

我如何用ruby做类似的事情?我将用什么来实现这一目标?

4 个答案:

答案 0 :(得分:4)

来自PHP的或多或少的直接重写:

albums = {}
songs = [
  { :title => 'Title 1', :artist => 'Artist 1', :album => 'Album 1' },
  { :title => 'Title 2', :artist => 'Artist 2', :album => 'Album 2' },
  { :title => 'Title 3', :artist => 'Artist 1', :album => 'Album 1' },
  { :title => 'Title 4', :artist => 'Artist 2', :album => 'Album 1' },
  { :title => 'Title 5', :artist => 'Artist 3', :album => 'Album 1' }
]
songs.each do |song|
  album = albums[song[:album]] ||= {}
  album[:title] = song[:title]
  (album[:songs] ||= []).push(song)
end
puts albums.inspect

更简单的是单行:

albums = songs.group_by { |song| song[:album] }

数组只有整数键,并将所有键分配到最高键(因此,如果指定foo[100] = 1,键0-99的位置也会占用内存(nil值);您注意带有方括号的数组值:[1, 2, 3]是一个3元素数组,[]是空的。

哈希用大括号{}括起来,几乎可以作为键。但是,块也可以用大括号写,所以注意不要混淆两者。

答案 1 :(得分:2)

你应该能够像使用PHP关联数组一样使用Ruby Hash。

答案 2 :(得分:2)

正如您在问题标题中提到的,关联数组通常在Ruby中称为哈希。语法与数组略有不同。

# Normal array
normArray = ["SomeSong", "SomeGuy"]
anotherNormArray = Array.new

# Literal hash
literalHash = { "Title" => "SomeSong", "Artist" => "SomeGuy" }

# Declared beforehand
declaredHash = Hash.new
declaredHash["Songs"] = literalHash

答案 3 :(得分:2)

你可以在一行中完成

songs = [
  {'title' => 'Title 1', 'artist' => 'Artist 1', 'album' => 'Album 1'},
  {'title' => 'Title 2', 'artist' => 'Artist 2', 'album' => 'Album 2'},
  {'title' => 'Title 3', 'artist' => 'Artist 1', 'album' => 'Album 1'},
  {'title' => 'Title 4', 'artist' => 'Artist 1', 'album' => 'Album 1'},
  {'title' => 'Title 5', 'artist' => 'Artist 3', 'album' => 'Album 1'}
]
songs.group_by{|h| h[:album]}.inject({}){|h,(album,s)| h[album] = {:title => album, :songs => s }; h }
#=> {"Album 1"=>{:songs=>[{:artist=>"Artist 1", :album=>"Album 1", :title=>"Title 1"}, {:artist=>"Artist 1", :album=>"Album 1", :title=>"Title 3"}, {:artist=>"Artist 2", :album=>"Album 1", :title=>"Title 4"}, {:artist=>"Artist 3", :album=>"Album 1", :title=>"Title 5"}], :title=>"Album 1"}, "Album 2"=>{:songs=>[{:artist=>"Artist 2", :album=>"Album 2", :title=>"Title 2"}], :title=>"Album 2"}}

只有我不明白你为什么两次使用专辑标题:作为哈希键和标题参数?您应该只使用一次,我认为:)

相关问题