Re: Each returns just last array

Robert Walker
Wed, 15 Feb 2012 15:03:14 -0000

Felipe Pieretti Umpierre wrote in post #1046904:
> Hello, what I want to do, the user gonna insert a string with right
> combinations.
>
> So, the user gonna put, the email[comma]name[semincolon]
>
> This way, I need to split the semicolon, to have the array of strings,
> after I need to split the comma, to have the name in a index, and the
> email in another.

Okay, I thought my earlier explanation would be sufficient to help you
achieve your goal, but I''ll try to explain further:

You are starting with this:

"myemail-S8S1utOw9MsAvxtiuMwx3w@public.gmane.org,My Name";
"myemail-4cajJJ5tN1zQT0dZR+AlfA@public.gmane.org,My Name"

I can''t guess what you want in your final result. There are multiple
ways to split and store this. So I''ll explain what I would do in this
case, assuming I want to keep all the information in the original
string:

# Start by splitting the string at the semicolons:
arr1 = params[ :email ][ :email ].split( ";" )

# Result:
[ "myemail-S8S1utOw9MsAvxtiuMwx3w@public.gmane.org,My Name",
"myemail-4cajJJ5tN1zQT0dZR+AlfA@public.gmane.org,My Name" ]

# Declare an array to store the final data
emails = []

# Enumerate the array we split
arr1.each do |str|
  # For each string in arr1 split at the comma
  arr2 = str.split(",")

  # Put the address and name in a hash (keyed by email address in this
case)
  h[arr2[0]] = arr2[1]

  # Append the hash to the final array
  emails << h
end

# Final result:
[ { "myemail-S8S1utOw9MsAvxtiuMwx3w@public.gmane.org": "My
Name" }, { "myemail-4cajJJ5tN1zQT0dZR+AlfA@public.gmane.org",
"My Name"
} ]

There might be some shortcut to the above procedure, but I wanted to
show all the individual steps to be clear what''s happening.

As I said before, this is only one possible way to store the results
keeping all the original data. You''ll have to decide what is best for
your particular case.