From: Keith D. <ya...@ke...> - 2002-09-07 20:02:43
|
>I have a question about PHP. It says that it is an "ordered map" but all of the examples I've seen show an associative container. In other words, is array( 'a' => 'b', 'c' => 'd') distinguishable from array( 'c' => 'd', 'a' => 'b'). If not, it is an associative container and not a "ordered map" as it says. If it is an ordered map, what is the syntax to get the nth key? When you do a foreach(){}, or use each(), you get the elements back in the same order you put them in. You can do current(), next(), prev(), end(), and reset() operations on a PHP array. Finally, you also get stack and queue operations like array_push(), array_pop(), array_shift(), and array_unshift(). I suppose you can't get the nth element from an array that isn't indexed by number without going through and counting :) but usually you don't need to do that. Also, if you test to see if the two arrays above are equal (==) they are, but if you test to see if they're "really equal" (===) they're not. So you have a little bit of both worlds. Keith |
From: Clark C. E. <cc...@cl...> - 2002-09-07 20:27:27
|
On Sat, Sep 07, 2002 at 04:01:57PM -0400, Keith Devens wrote: | > I have a question about PHP. It says that it is an "ordered map" but | > all of the examples I've seen show an associative container. | | When you do a foreach(){}, or use each(), you get the elements back in | the same order you put them in. By elements do you mean "values" or "pairs"? | You can do current(), next(), prev(), end(), and reset() operations | on a PHP array. Finally, you also get stack and queue operations like | array_push(), array_pop(), array_shift(), and array_unshift(). Ahh, so it has a built-in iterator too? *shudders* | I suppose you can't get the nth element from an array that isn't indexed | by number without going through and counting :) but usually you don't | need to do that. Also, if you test to see if the two arrays above are | equal (==) they are, but if you test to see if they're "really equal" | (===) they're not. So you have a little bit of both worlds. Ok. It looks like PHP is powerful enough to match a "collection" vs "scalar" distinction; but wouldn't support a "map" vs "list" distinction as well. I've been seriously pondering if "map" vs "list" belongs in the generic model for quite some time. You only loose a few graph operations if you just roll them together as a single construct (a function) and the mathematical models get considerably simpler. I'm definately opposed to making the "collection" in the YAML generic model a "named list" or a "ordered map" and want to stick to a straight "function" be it implemented as an array, hashtable, or whatever. So in this regard PHP would be *stronger* than YAML's generic model... which is probably good. That said, since the distinction between hashtable/array, dictionary/list is in perl/python could be modeled as type-id rather than as a different "kind". Thank you for the help! Best, Clark |
From: <ir...@ms...> - 2002-09-07 20:51:35
|
On Sat, Sep 07, 2002 at 08:29:05PM +0000, Clark C. Evans wrote: > On Sat, Sep 07, 2002 at 04:01:57PM -0400, Keith Devens wrote: > | > I have a question about PHP. It says that it is an "ordered map" but > | > all of the examples I've seen show an associative container. > | > | When you do a foreach(){}, or use each(), you get the elements back in > | the same order you put them in. > > By elements do you mean "values" or "pairs"? foreach($arr as $v) { ... $v is value ... } foreach($arr as $k => $v) { ... $k is key, $v is value ... } > | You can do current(), next(), prev(), end(), and reset() operations > | on a PHP array. > > Ahh, so it has a built-in iterator too? *shudders* Yes but there's only one iterator per array. -- -Mike (Iron) Orr, ir...@ms... (if mail problems: ms...@oz...) http://iron.cx/ English * Esperanto * Russkiy * Deutsch * Espan~ol |
From: Keith D. <ya...@ke...> - 2002-09-07 20:57:16
|
> On Sat, Sep 07, 2002 at 04:01:57PM -0400, Keith Devens wrote: > | > I have a question about PHP. It says that it is an "ordered map" but > | > all of the examples I've seen show an associative container. > | > | When you do a foreach(){}, or use each(), you get the elements back in > | the same order you put them in. > > By elements do you mean "values" or "pairs"? Well, whatever you ask for is given to you in order. So array_keys() and array_values() give you things that way. The loops will let you specify whether you want pairs or just values, so you can say foreach($arr as $key=>$val){}or just foreach($arr as $val) (I don't like the "as" syntax either). Similarly for while: while(list($key, $val) = each($arr){} or just while(list(,$val) = each($array){}. each() by itself actually gives you this: Array ( [1] => b [value] => b [0] => a [key] => a ) Which I never knew before. So list() looks at the numeric indices. |