On Mon, 2005-01-10 at 12:44, Richard Lynch wrote: > Robert Cummings wrote: > > On Mon, 2005-01-10 at 11:28, Richard Lynch wrote: > >> Thomas Goyne wrote: > >> > On Sun, 09 Jan 2005 15:59:43 +0100, M. Sokolewicz <tularis@xxxxxxx> > >> wrote: > >> > > >> >> that's not a SPECIFIC place in the array, that's just current, next > >> and > >> >> previous. AFAIK there is no way to explicitly set the internal > >> pointer > >> >> of the array to a spcified place. I used a function which basically > >> >> looped trough the array until it got to the correct depth, and then > >> >> returned it by reference....but it's not very efficient :S > >> >> > >> > > >> > Why would you ever want to do that other than to waste cycles? > >> > >> I'll give you a simple case. > >> > >> I have a GTK PHP MP3 ID3 editor application I'm working on. > >> > >> When one opens a file in a directory, I provide next/prev buttons to > >> quickly page to the next/prev file in the directory. > >> > >> Getting the next/prev to work is simple enough, but... > >> > >> I've got the whole array built from opendir/readdir, and sorted it into > >> alphabetical order. > >> > >> I've got a filename inside that array, from the pre-defined > >> GtkFileSelection dialog. > >> > >> So I need to initialize the internal array pointer to the position of > >> the > >> file within that array, there is no such PHP function. > > > > Why not change your structure? Sounds like you want a linked list, > > better yet a doubly linked list. So create a double linked list class, > > link up your entries, and keep a hash available for fast lookup into the > > linked list where the keys are the filenames or whatever you want to use > > as an index, and the value is a reference to the interesting linked list > > node. > > Uhhhm. Yeah. > > I could spend hours finding/writing a doubly-linked list class, which will > be a good bit slower and WAY more memory-bloated than the built-in PHP > doubly-linked list (aka 'array') and, in theory, I could code it so that > the 'set_current' function existed and was maybe a bit faster than walking > the PHP array... > > But every *other* operation would be a lot slower, and I only need to walk > the list to initialize the internal current pointer once, when the user is > already distracted and slowed down by the Open File dialog. > > I think the user experience will be *much* better without all that, though. > > > if( $currNode->hasNext() ) > > { > > $currNode = &$currNode->next(); > > } > > if ($current != $array[count($array) - 1]) $current = next($array); > > > Moving backward would be as simple as: > > > > if( $currNode->hasPrevious() ) > > { > > $currNode = &$currNode->previous(); > > } > > if ($current != $array[0]) $current = prev($array); > > Actually, the buttons are disabled if you are on the first/last item, so > the checks for hasNext/hasPrevious are done elsewhere anyway. > > > And if the user selects an arbitrary file: > > > > $currNode = &$lookupArray[$index]; > > No, no, no. > > The FileSelection already returns the filename. > > Of course, I just *built* that array based on the directory they chose, so > could initialize the $current_index as the array got built... > > So I'd need to keep an *INVERSE* array internally to do: > $current_index = $inversearray[$filename]; > > So then I'd be keeping track of the $current_index, at which point I'd not > even *NEED* to bother with next/prev and friends: I'd just have a global > variable for the integer index in the array, and play with that in PHP. > > No bloated class objects to track something as simple as an integer from 0 > to (count($array) - 1) > > Maybe I'll just ditch the internal prev/next stuff and use $CURRENT_INDEX > as a global everywhere and write my own prev/next functions to do integer > arithmetic instead. Seems kinda silly when it's all already built-in to > PHP *except* set_current() but there ya go. > > > This kind of structure works a lot like a doubly threaded red-black tree > > :) Although a red-black tree would keep your entries in sorted order > > whenever you add new entries in O( lg n ) time. > > You're comparing O(lg n) in PHP to O(lg n) in built-in C from PHP. Not > the same at all until we start hitting the kind of numbers that aren't > even useful for the number of files in a single directory. > > I'm *not* going to set this box up to have 10,000 files in the same > directory. Puhlease! > > The only time something is added to my tree is when they open up a new > directory, at which point the whole tree is re-built from scratch, since > it will have zero (0) elements in common with the previous tree. > > As much as I love Object-Oriented programming, it amazes me what lengths > people will go to in order to use it no matter how inappropriate it may be > to the task at hand. :-) I was going to write a lengthy response to your berating, but then I remembered you're a procedural zealot and the above comments aren't much better than the bait on the end of a troll's line. Cheers, Rob. -- .------------------------------------------------------------. | InterJinn Application Framework - http://www.interjinn.com | :------------------------------------------------------------: | An application and templating framework for PHP. Boasting | | a powerful, scalable system for accessing system services | | such as forms, properties, sessions, and caches. InterJinn | | also provides an extremely flexible architecture for | | creating re-usable components quickly and easily. | `------------------------------------------------------------' -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php