You are here: Re: [PHP] How do I start at a specific position in an array? Is there « PHP « IT news, forums, messages
Re: [PHP] How do I start at a specific position in an array? Is there

Posted by Robert Cummings on 10/04/48 11:05

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@php.net>
> >> 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. |
`------------------------------------------------------------'

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация