Waarom niet? Het is niet alsof je array indices consecutive moeten zijn. Dat het integer keys heeft wil nog niet zeggen dat het een array is. Het is en blijft gewoon een (geordende) hash-map. Ook voor integer keys.
Of dat zo pragmatisch is is maar de vraag. Arrays zijn hashmaps, maar worden vaak gewoon behandeld als arrays (niet zo gek, gezien het feit dat je geen echte arrays hebt). Dit is nogal een gekunstel in de standaard functies die werken op arrays. Neem bijvoorbeeld
array_merge():
Merges the elements of one or more arrays together so that the values of one are appended to the end of the previous one. It returns the resulting array.
If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended.
De redenatie snap ik wel. Voor arrays wil je geen waarden overschrijven maar gewoon 2 arrays concantenaten. Voor hashmaps wil je ze combineren zodat duplicates verdwijnen. Echter, als ik m'n "array" gewoon wil benaderen als hash-map waar toevallig integer keys in staan ben ik de sjaak, omdat deze functie m'n hashmap dan ziet als array. En dit is slechts een voorbeeld, de hele array lib zit vol met dit soort dingen. Het was wellicht pragmatisch tijdens de implementatie van de taalfeature, maar zeker niet meer toen de library erbij gemaakt werd.
Overigens heeft ook javascript hier last van.
JavaScript:
1
2
3
| var a = [];
a[100] = 34;
alert(a.length); |
Jawel, 101. Terwijl er toch echt maar 1 element in staat. Wat javascript hier vooral mist is een goede manier om over alle elementen heen te lopen.
for (var i = 0; i < a.length; i++) wordt meestal aangeraden, wat goed werkt voor echte arrays maar niet voor bovenstaand voorbeeld. De
for (var i in a) enumereert over alle properties, dus ook custom functies die je toevallig aan Array.prototype hebt toegevoegd. Wel logisch, die functies zijn dan immers ook gewoon onderdeel van a. Maar niet altijd even handig.
[
Voor 84% gewijzigd door
.oisyn op 31-03-2009 15:02
]