9 ms·
Why doesn't this code simply return a to z as the output?
- gregable 16y agoThat is ridiculous.
- boyter 16y agoBecause it isn't like C in that aspect but more like Perl?
- Locke1689 16y agoEh, I happen to think the Perl behavior is just as ridiculous. Defining the addition operator on a string and an integer to create some kind of complete lexographical ordering is completely counterintuitive and, moreover, is probably not useful enough to warrant such behavior.
- msbarnett 16y agoPHP is like that. Few other languages would feel comfortable with simultaneously defining 'z'+1 as 'aa', while asserting that 'aa' is strictly less than 'z'.
- toolate 16y agoWhile I agree that 'z'++ being 'aa' is a bit silly, I can't ever see anyone making the case that 'aa' should be greater than 'z'.
- msbarnett 16y agoIt's not that 'aa' would make any sense being greater than 'z', it's just the non-intuitive result that comes out of the combination of those features. To my mind it's a good example of how languages that try to throw in every feature and the kitchen sink end up acquiring a lot of bizarre warts from unforeseen interactions.
- zackattack 16y ago'z'++ is not 'aa'. 'z'++ is not even valid PHP. $z='z';$p=$z++; does nothing either. it's only in the for-loop context.
- tel 16y agoAs long as we're enforcing ordering on casually unordered sets, when not define it as length of the string? Now 'aa' is certainly greater than 'z'.
- brianpan 16y agoThere's a pretty good case for making the comparison closer to alphabetical ordering. 'apple' before 'pear' even though 'apple' is the longer string. 'z' before 'zz' also follows alphabetical ordering.
- roel_v 16y agoThat's what I was thinking, and in this case 'zz' would be > 'a'. I'd say that's a reasonable choice.
- Nitramp 16y agoNote that there is no such thing as "the alphabetical ordering". Different languages define different collations, and some even multiple ones (e.g., German collation vs German phone book collation, or the various collation systems for Chinese characters). I'm pretty sure PHP's comparison operator will define non-ASCII characters as being outside of the alphabet, and probably just fail on multi-byte strings (UTF-8). So if you are doing comparisons on strings, you probably either have an i18n bug or a really, really specific use case.
- trezor 16y agoClearly you have not ventured too far outside the "safe" en-US cultures ;) In the Scandinavian languages (Danish, Swedish and Norwegian) "aa" is (for whatever historical reasons) considered a synonym for "å", which is that last letter of the alphabet. In the same way "ae" maps "æ" (third last) and "oe" maps to "ø" (second last). Hence, using culture-aware sorting, the following array may actually not be sorted: [ "a", "aa", "ae", "b", "oe", "of" ]. You will find similar sort behaviour in a lot of databases when you set the database/table/column collation to other cultures. While I agree the PHP implementation is silly, your blanket dismissal of the possibility that 'aa' can't be greater than 'z' is equally ignorant.
- auxbuss 16y agoA couple of years ago I had to devise PHP sort algorithms for Danish, German, and Russian. (Unsurprisingly, native speakers are essential for testing this kind of thing ;) ) It was surprising at the time that these sort algorithms were not generally available in code. We also found that we couldn't rely on the db (MySql) to do the right thing, which was not helped, of course, by having these character sets, and others, in the db. The db was fully utf8. Once you grok PHP's underlying method, it's simply a case of using the above mentioned technique -- replacing the "foreign" symbols with character pairs -- to establish the correct order. In the Danish case above, for example, I used zx, zy, and zz.
- hardik988 16y agoThat's fascinating. I wonder what was the reason behind putting such a reasoning on string manipulation.
- gjm11 16y agoYeah, it's an absolutely ridiculous combination. On the other hand ... unsigned char c; for (c=0; c<=255; ++c) { printf(" %d", c); } printf("\n"); exhibits the exact same problem, which all C's integral types have. So unless you embrace Bignums Everywhere (or at least automatic promotion to bignum and therefore Potential Bignums Everywhere Except Where The Compiler Can Prove Otherwise) it's hard to avoid.
- rll 16y agoWell, the choice was between having 'z'++ go to 'aa' vs. '{'. In most cases when you are comparing strings you want to do so alphabetically, not by their underlying character code. As mentioned in the thread there, Perl made the same decision. If you want to compare by character code, use ord() on it. Writing a loop like that is also a bit of a weird edge-case. You would typically just call range('a','z') to get an array of a through z.
- chime 16y agoWhy does it even execute z++? Shouldn't it stop at 'z' since that is set as the end condition of the for loop?
- dangrossman 16y ago'z' + 1 is 'aa' which is not less than 'z' lexicographically, so the end condition is NOT met and the loop continues
- brianpan 16y agoThe for loop runs while $i is less than or equal to 'z'.
- jwr 16y agoAlso, one might wonder why it stops at 'yz' instead of continuing on forever. There is no logic in this insanity — you won't know until you try it out.
- zephyrfalcon 16y agoI think it's because the next value, 'za', is neither equal to 'z' nor "less" than it, so the condition fails, and the loop ends.
- bdr 16y agoThere is a third, correct choice: don't allow incrementing of strings. Everything you say about comparing is true, but that's a separate issue.
- alextgordon 16y agoIt seems to me that the issue is that $i++ is nonsensical if $i is a string (and $i is a string, not a character). But instead of raising an error, PHP soldiers on and tries to apply some completely unexpected function.
- nostrademons 16y agoIt's actually occasionally useful if you're trying to gensym a string. In a normal language, you need to write your own gensym function - in PHP, you know that $s++ will create a sequence of unique strings, suitable for use in b64-only environments, that will never run out.
- photon_off 16y agoPerl does this, too. And is it really that unexpected? How many possible things could 'z'+1 return? The only possibilities that make sense to me are "{", "aa", or an error. I like PHP because it's flexible, and this often makes life easier. If you're really going to try to use strings as integers, then you deserve what's coming to you. If you're going to use this behavior as a feature, then you've just saved yourself a chunk of time.
- pbhjpbhj 16y ago>How many possible things could 'z'+1 return? That are less than or equal to z?
- loewenskind 16y agoMore sensible would be to not overload the ++ or +1 operator to do this but provide a different function. Then the capability is there but something unexpected doesn't happen in the presence of type errors.
- zackattack 16y agopeople talk about RoR, Django, Haskell++, Node.js, you name it. me? i'm sticking with PHP. i'm gonna be damn good at this language eventually.
- mahmud 16y agoPHP can remain insane longer than you can remain alive.
- TimothyBurgess 16y agoThis actually makes perfect sense to me. Knowing this would have really come in handy a while back when I was creating my dynamic excel spreadsheet generator in PHP. While it doesn't follow ASCII char indexes, it follows a base 26 numbering system. Edit: Oh... and if anyone was wondering, PHP's "char" function (provided an index) should perform similar to incrementing an ASCII char in C/C++.
- daeken 16y agoNote: chr not char