Jim Gibson wrote: > On 9/30/09 Wed Sep 30, 2009 11:33 AM, "Bruce Ferrell" > <bferr...@baywinds.org> scribbled: > >> >> Shawn H Corey wrote: >>> Bruce Ferrell wrote: >>>> I have a database (mysql if it matters) and I can select columns and >>>> rows from it no problem. what I can't quite seem to see how to do is to >>>> take the columns I can select and put them into a 2 dimensional array. >>>> >>>> I tried this: >>>> >>>> @data = $sth->fetchrow_array(); >>>> >>>> and it got a two dimensional array of one element each and this: >>>> >>>> @rtn = $sth->fetchrow_array(); >>>> push(@data,@rtn) seems to get me a giant 1 dimensional array. >>>> >>>> I'm sort of at a loss >>>> >>>> TIA >>>> >>>> Bruce >>>> >>> You have to create an array of arrays. >>> >>> push @data, [ @rtn ]; >>> >>> See: >>> perldoc perldsc http://perldoc.perl.org/perldsc.html >>> perldoc perllol http://perldoc.perl.org/perllol.html >>> perldoc perldata http://perldoc.perl.org/perldata.html >>> >>> >> OK if I read these right and I understand the results of my experiments >> correctly, this: >> >> @rtn = $sth->fetchrow_array(); >> >> is giving me an array with two elements and this: >> >> push @data, [ @rtn ]; >> >> is giving me an array of 2 element arrays. Not good as what I want is 2 >> arrays each the length of the total rows returned. What it seems I need >> to do is something like this: >> >> my ( $current_level, $time ) = $sth->fetchrow_array(); >> >> push @data[0][#]->$current_level; >> push @data[1][#]->$time; >> >> ... repeat until out of rows >> >> Is that correct notation to add the variable to the end of the array(s)? > > No. Apparently what you want is > > push( @{$data[0]}, $current_level); > push( @{$data[1]}, $time); > > You could also define two separate arrays: > > my @current_levels; > my @times; > > and fill them with similar statements: > > push( @current_levels, $current_level); > push( @times, $time); > > and put links to them in @data: > > my @data = ( \...@current_levels, \...@times ); > > Some would consider that a poor choice of data structure, as your pairs of > elements are only associated by using a common index. > > for my $row ( 0..$#{$data[0]} ) { > my $level = $data[0]->[$row]; > my $time = $data[1]->[$row]; > } > > There is no guarantee that the two arrays even have the same number of > elements. > > Most people would prefer Shawn's scheme: > > push( @data, [ $current_level, $time ]); > > The two data elements are very closely associated. You can sort them by time > and extract them together: > > for my $row ( sort {$a->[1] <=> $b->[1]} @data ) { > my{ $level, $time ) = @$row; > } > > which is much more difficult to do in the first case. > > So why do you think you need to have two arrays the same length containing > data from different rows? >
Most excellent assistance sir! The @data structure gets passed the GD::graph to make pretty line graphs and it likes to see it's input data that way. It may like it in other ways too, but I'm a bit of a neophyte (as I'm sure you can tell). As the data comes from a DB where it's already tied together, there is an implicit sort of guarantee so the poor structure can, I think, be forgiven. Thank you! Bruce -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/