Автор Тема: Интересен проблем с РНР цикъл  (Прочетена 2571 пъти)

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Здравейте,

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

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

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

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

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



Активен

sdr

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

senser

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

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

sdr

  • Напреднали
  • *****
  • Публикации: 655
    • Профил
Интересен проблем с РНР цикъл
« Отговор #3 -: Jun 29, 2006, 18:25 »
То сега ако седнем да си задаваме въпроси каква е логиката в PHP можем да откараме няколко дена. Доколкото знам няма char но ти определено не работиш праилно с стринговете за тях не е дефинирана операция + така че можеш да се сърдиш че не те псува за това но не можеш да се сърдиш че работи до у '<img'>
Активен

  • Гост
Интересен проблем с РНР цикъл
« Отговор #4 -: Jun 29, 2006, 18:43 »
'<img'>  '<img'>
Цитат

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


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

Цитат

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


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

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''<img'> == 90, ord('[''<img'> == 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

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Интересен проблем с РНР цикъл
« Отговор #5 -: 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  '<img'>. И oт къде следва, че 'АА' е по-малко от 'Z'?
Активен

  • Гост
Интересен проблем с РНР цикъл
« Отговор #6 -: Jun 30, 2006, 14:46 »
Цитат

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

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

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

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

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

Хм - май е ZA, не ZZ
Активен

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Интересен проблем с РНР цикъл
« Отговор #7 -: Jun 30, 2006, 17:13 »
Цитат (Guest @ Юни 30 2006,14:46)
Цитат

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

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

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

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Интересен проблем с РНР цикъл
« Отговор #8 -: Jul 04, 2006, 17:58 »
Ееей оставихте ме да си блъскам главата сам с такъв "глупав" проблем  '<img'>
Активен

  • Гост
Интересен проблем с РНР цикъл
« Отговор #9 -: Jul 05, 2006, 10:42 »
Какъв проблем ? Неразбирам какво точно питаш ?
Активен

senser

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



Активен

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

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Интересен проблем с РНР цикъл
« Отговор #12 -: 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) и цикъла продължава.

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