2011-01-15 4 views
0

Essayer de porter un ancien code PHP vers Ruby et de manquer des informations clés sur la création de tableaux dans Ruby.Boucler et créer un tableau dans Ruby

Le code PHP:

foreach ($results as $r) { 
    $array[$r['column']][] = $r 
} 

Est-ce la façon la plus simple de le faire en Ruby? Dois-je initialiser le deuxième tableau? Je pense qu'il s'agit d'un problème de syntaxe simple, mais mon Googling est vide. Merci de votre aide!

+0

Ces tableaux ou hachages sont-ils des hachages de tableaux? Qu'est-ce que 'r.column', et quel est le résultat souhaité? – Phrogz

Répondre

1

Vous indexez dans un tableau vide, de sorte que retournera toujours nil. nul ne définit l'opérateur < <, donc vous obtenez une erreur. Vous devez initialiser la valeur de array [index] si vous voulez utiliser l'opérateur < <.

Je suppose que vous voulez un tableau de tableaux, vous pouvez donc utiliser ce lieu qui REINITIALISERA la valeur à des éléments [index] à un tableau vide si elle est nulle avant de pousser la valeur sur elle

items = [] 
array.each do |r| 
    (items[r.column] ||= []) << r 
end 

Le seul changement ici est que, si les éléments [r.column] retourne zéro, il sera égal à un tableau vide, sinon rien ne sera fait. Si vous ne voulez vraiment que définir la valeur des éléments [index] à r, utilisez simplement l'opérateur =.

+0

Merci Ed! Je pensais qu'il y avait un moyen plus court de le faire. – jmccartie

+0

Pas de problème. Ce n'est pas équivalent à votre exemple de code. Votre extrait effacera la valeur actuelle des éléments [r.column] à chaque fois, tandis que le mien ne s'initialisera que s'il est nul et ajoutera la valeur. –

0
array = results.inject([]) { |m, r| m[r.column] = r; m } 

Mise à jour: oh, e1[] = e2 ajoute un nouvel élément de tableau en PHP, donc tokland est juste, auquel cas:

array = results.inject([]) { |m, r| (m[r.column] ||= []) << r; m } 
+0

Je pense que l'OP veut accumuler des valeurs dans un tableau, pas simplement remplacer le dernier. – tokland

0

Êtes-vous sûr que vous avez besoin d'un tableau en tant que sortie? il semblerait qu'un hachage serait plus commode; De plus, il est beaucoup plus facile de construire dans votre scénario (ce qui est généralement un signe que vous êtes dans le bon chemin):

# example 
results = [ 
    OpenStruct.new(:x => 1, :cron_column => 0), 
    OpenStruct.new(:x => 2, :cron_column => 1), 
    OpenStruct.new(:x => 3, :cron_column => 1), 
] 

@array = results.group_by(&:cron_column) 
# {0=>[#<OpenStruct x=1, cron_column=0>], 
# 1=>[#<OpenStruct x=2, cron_column=1>, #<OpenStruct x=3, cron_column=1>]} 

Si cron_column « n'a pas de trous » (ce qui est, vous avez des valeurs de 0 à N) , vous pouvez facilement créer un tableau avec cette même idée: results.group_by(&:cron_column).sort.map { |k, v| v } ou results.group_by(&:cron_column).sort.map(&:last), comme vous préférez.

Questions connexes