Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: senser в Jun 29, 2006, 14:57



Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jun 29, 2006, 14:57
Здравейте,

Става дума за следното: пиша един скрипт на РНР, който ще представлява терминологичен речник. Термините от речника се пазят база данни....., но това е без значение за проблема.
Правя следния цикъл с цел извеждане на буквите от английската азбука:
Примерен код

for($i='A'; $i<='Z'; $i++)
echo $i.'&nbsp;'.sizeof($i).'&nbsp;'.gettype($i).'<br/>';

Резултата от изълнението на този фрагмент от скрипта може да се види
тук.
Интересното е, че ако цикъла е от "А" до "У" работи, както се очаква - извежда буквите от "А" до "У", но като го пусна от "А" до "" и се получава това.

Идеи защо се получва така ?

П.П. Нарочно съм сложил за тест да се извежда размера и типа на променливата по време на итерациите





Титла: Интересен проблем с РНР цикъл
Публикувано от: sdr в Jun 29, 2006, 17:07
Така става като нямаш добре дифинирани типове ... може и да има резон в поведението в контекста на стрингове - аз незнам какво прави оператора + върху стрингове ... за това най добре ползвай ord и char


Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jun 29, 2006, 18:14
Цитат (sdr @ Юни 29 2006,17:07)
Така става като нямаш добре дифинирани типове ... може и да има резон в поведението в контекста на стрингове - аз незнам какво прави оператора + върху стрингове ... за това най добре ползвай ord и char

1. Аз също предположих, че проблема е в типа на променливата, но доколкото знам в РНР няма променлива тип "char" - поправете ме ако греша
2. И все пак каква е логиката цикълът да работи от "А" до "У".


Титла: Интересен проблем с РНР цикъл
Публикувано от: sdr в Jun 29, 2006, 18:25
То сега ако седнем да си задаваме въпроси каква е логиката в PHP можем да откараме няколко дена. Доколкото знам няма char но ти определено не работиш праилно с стринговете за тях не е дефинирана операция + така че можеш да се сърдиш че не те псува за това но не можеш да се сърдиш че работи до у ;)


Титла: Интересен проблем с РНР цикъл
Публикувано от: в Jun 29, 2006, 18:43
???  ???
Цитат

То сега ако седнем да си задаваме въпроси каква е логиката в PHP можем да откараме няколко дена


Айде сега - на крив космонавт космоса му бил виновен или там както се казваше. Не е проблема в ПХП-то   :D

Цитат

 но ти определено не работиш праилно с стринговете за тях не е дефинирана операция + така че можеш да се сърдиш


В грешка си - земи да прочетеш из ръководството! Оператора за инкрементиране си работи ОК със стрингове, просто не си запознат как точно действа. Ето от ръководството:
Цитат

PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z';) == 90, ord('[';) == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.


Сега предполагам става ясно, че след Z следва AA, а както сам ще се сетиш AA е по-малко от Z. Това е причината тое цикъл да се завърти чак до ZZ, което вече е по-голямо от Z.
Въобще - не е това начина да постигнеш това което искаш. Ето как според мен трябва да го направиш:
Примерен код

for ($i=65; $i<=90; $i++) {
 $x = chr($i);
 print $x;
}


Естествено става и по "твоя" начин - ако го промениш малко, да речеме така:
Примерен код

for($i='A'; $i!='AA'; $i++)
echo $i.'&nbsp;'.sizeof($i).'&nbsp;'.gettype($i).'<br/>';


Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jun 30, 2006, 10:43
1. Не съм си и помислил че проблема е в РНР. Ясно ми е, че аз греша и искам да разбера къде точно.
2. Инкрементирането на char променлива не би трябвало да е по-различно от това на integer примерно. Затова и помислих, че така "завъртян" цикъла не трябва а е проблем. Естествено скрипта го направих по друг начин (един от многото възможни начини), но не можах да стигна до логично обяснение защо "върти" до "ZZ".
3. Не знаех това, че в РНР char инкрементирането работи по този начин:
Примерен код

PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z';) == 90, ord('[';) == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.

И пак не мога да си го обясня - ОК след 'Z' следва 'АА', но защо цикъла стига изобщо до 'Z'+1  ???. И oт къде следва, че 'АА' е по-малко от 'Z'?


Титла: Интересен проблем с РНР цикъл
Публикувано от: в Jun 30, 2006, 14:46
Цитат

но защо цикъла стига изобщо до 'Z'+1

Защото Z е <= Z, след което следва Z+1, което е на практика AA
Цитат

И oт къде следва, че 'АА' е по-малко от 'Z'?

Защото първата буква от АА е A, а A е преди Z.
Цитат

Това е причината тое цикъл да се завърти чак до ZZ, което вече е по-голямо от Z.

Хм - май е ZA, не ZZ


Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jun 30, 2006, 17:13
Цитат (Guest @ Юни 30 2006,14:46)
Цитат

но защо цикъла стига изобщо до 'Z'+1

Защото Z е <= Z, след което следва Z+1, което е на практика AA

E по тази логика един цикъл <=10 ще върти до 11 ....  ???


Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jul 04, 2006, 17:58
Ееей оставихте ме да си блъскам главата сам с такъв "глупав" проблем  :D


Титла: Интересен проблем с РНР цикъл
Публикувано от: в Jul 05, 2006, 10:42
Какъв проблем ? Неразбирам какво точно питаш ?


Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jul 06, 2006, 10:27
Sorry, сега забелязах, че линка вече не работи.
Поправил съм го и сега се вижда какъв ми е проблема с въртенето на цикъла - продължавам да не мога да схвана зао върти и след "Z"





Титла: Интересен проблем с РНР цикъл
Публикувано от: в Jul 06, 2006, 11:14
Така както си го написал $i<='Z' , следва че тое цикъл ще се върти докато $i нестане по-голямо от Z !
Кога $i ще бъде по-голямо от Z е въпроса ?
Когато $i=Z условиетео $i<='Z' е изпълнено, след което $i става AA ... при $i=AA условието $i<=Z пак е изпълнено (AA<Z) и цикъла продължава.


Титла: Интересен проблем с РНР цикъл
Публикувано от: senser в Jul 06, 2006, 16:12
Цитат (Guest @ Юли 06 2006,11:14)
Така както си го написал $i<='Z' , следва че тое цикъл ще се върти докато $i нестане по-голямо от Z !
Кога $i ще бъде по-голямо от Z е въпроса ?
Когато $i=Z условиетео $i<='Z' е изпълнено, след което $i става AA ... при $i=AA условието $i<=Z пак е изпълнено (AA<Z) и цикъла продължава.

Мдаааа, не съм предполагал, че един елементарен цикъл "фор" няма да го схвана веднага..... :(.
Както се казва: "от дървото не мога да видя гората".
Мерси на всички за помощта!