Autor Zpráva
Petr Kuba
Profil *
Ahoj,
jak muzu zjistit pocet radku v php? Proste potrebuji vypsat text ktery ma pokazde jiny pocet znaku a hlavne pokazde jine znaky, cili omezeni poctem znaku nefunguje a tak potrebuji vypsat text ktery se vleze do 4 radku, co bude nad 4 radky tak oriznout. Nevite nekdo jak na to? Nebo neexistuje nejaka FCI? Dekuji
imploder
Profil
střílím od boku:
$radku = 1;
$delka = strlen($retezec);
for($i=0; $i<$delka; $i++) if($retezec[$i]=='\n') $radku++;


Začíná se na prvním řádku, na každém konci řádku (tj. znaku '\n') se počet zvýší. V proměnné $radku by měl pak být počet řádků řetězce $retezec.
Majkl578
Profil
$lines = substr_count($string, "\n") + 1;
imploder
Profil
A na to, co potřebuješ, se hodí nejdřív použít wordwrap() na nařezání textu na řádky (pokud nemáš konce řádků pevně stanoveny) a pak:
$delka = strlen($retezec);
for($i=0, $nr=0; $i<$delka && $nr<4; $i++) {
  if($retezec[$i]=='\n') $nr++;
  echo $retezec[$i];
}

To vypisuje znaky řetězce dokud nenarazí na 4. konec řádku. Vypíše se i ten 4. konec řádku a tím to končí.
Petr Kuba
Profil *
a cim se to vypisuje?
echo $delka; ?

a pujde to nastylovat potom jako text-align: justify?

diky
imploder
Profil
Petr Kuba
Myslíš ten můj druhý kód? Ten se vypisuje sám - příkazem echo $retezec[$i];, co v něm je. Se stylováním to nesouvisí, půjde to nastylovat úplně stejně jako jakýkoliv jiný text.
<div style="text-align:justify">
<?php
$delka = strlen($retezec);
for($i=0, $nr=0; $i<$delka && $nr<4; $i++) {
  if($retezec[$i]=='\n') $nr++;
  echo $retezec[$i];
}
?>
</div>
Petr Kuba
Profil *
porad to ale nejak nechapu, co to presne ma udelat? vypise to text jen na 4 radky?

diky
imploder
Profil
Petr Kuba
Vypíše to první 4 řádky textu. Kde řádky končí musí být už v tom řetězci určeno. Pokud chceš délku řádku omezit na určitý počet znaků, použij na $retezec nejdřív funkci wordwrap().
Petr Kuba
Profil *
aha, jenze tady je problem v tom, za znak i a znak treba H ma jinou sirku a tudiz pocet znaku bude pusobit pokazde s jinou delkou..
Petr Kuba
Profil *
pri stejnem poctu znaku
imploder
Profil
Petr Kuba
Pokud použiješ neproporcionální písmo, tak mají všechny znaky stejnou šířku. Na co to vlastně potřebuješ? Na stránkách se text zalamuje automaticky a skript to nemusí řešit. Význam by to mělo v případě, že opravdu chceš řádky dlouhé nejvýš přesný počet znaků, třeba 80 pro zobrazení na terminálu nebo pokud se výstup ukládá do txt souboru.
Petr Kuba
Profil *
Potrebuji to k vypisu uplne stejnych odstavcu, cili nejak takto, max 4 radky, jelikoz mam pevne stanoveny "height"

x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx

x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx

x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx
x xxx xx x xxxx xxxx xxxxx xxx xxx


Ps: neproporcionální písmo ? jako napriklad jake? Je to bezne dostupne a zobrazuje se v vsech prohlizecich spravne?

dekuji
imploder
Profil
Petr Kuba
Tak do řetězce dej konce řádků přesně tam, kde je chceš mít, a je po problému. Není potřeba kvůli něčemu takovému šaškovat se zvláštníma funkcema.

Jednoduchý postup:
- text zkopíruj do souboru, třeba soubor.txt a ten ulož do adresáře se skriptem
- tam, kde ho chceš vypsat, dej
echo nl2br(file_get_contents("soubor.txt"));


Samozřejmě můžeš místo v souboru mít text přímo ve skriptu:
echo "x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx<br>" 
    ."x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx<br>" 
    ."x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx xxxxx xxx xx x xx<br>" 
    ."x xxx xx x xxxx xxxx xxxxx xxx xxx xxx xxxx xxxx xxxx";


Ps: neproporcionální písmo ? jako napriklad jake? Je to bezne dostupne a zobrazuje se v vsech prohlizecich spravne?
Konkrétně například Terminus nebo Courier. V CSS se neproporcionální písmo nastavuje
font-family: monospace
tiso
Profil
Petr Kuba - stačí v CSS tomu prvku s výpisom nastaviť overflow: hidden;
DJ Miky
Profil
… a zadat výšku (height).
tiso
Profil
DJ Miky - to už spomenul v [#12]
joe
Profil
jelikoz mam pevne stanoveny "height"
A pokud si uživatel zvětší písmo, tak si toho asi moc nepřečte.
czhDavid
Profil *
Pokud se nepletu tak zdejší verze kodu nebudou fungovat.
Podmínka if($retezec[$i]=='\n') se totiž nemůže splnit.$retezec[$i] je totiž pouze jeden jediný znak a v této podmínce je porovnáván s \n což jsou dva znaky(kontoloval sem to pomocí strlen). tudíž správný zápis podmínky by byl if($retezec[$i]=='\' && $retezec[$i+1]=='n').
Poté již script bude fungovat správně
imploder
Profil
czhDavid
$retezec[$i] je totiž pouze jeden jediný znak a v této podmínce je porovnáván s \n což jsou dva znaky(kontoloval sem to pomocí strlen)
Zřejmě jsi to zkoušel ve Windows. Windows opravdu používá jako konec řádku 2 znaky: <CR><LF>. V Unixu je konec řádku jen jeden znak: <LF>.
http://en.wikipedia.org/wiki/Linebreak#Representations

Na konec řádku jako 2 znaky by se to muselo upravit. Nepočítal jsem s tím, že to někdo použije jako hotové řešení, spíše to je pro inspiraci.
imploder
Profil
czhDavid
vlastně jde o trochu jiný problém:
tudíž správný zápis podmínky by byl if($retezec[$i]=='\' && $retezec[$i+1]=='n').
\n je v PHP escape sekvence, tj. zápis speciálního znaku, který se převede na něco jiného (v tomto případě na znak <LF>, tedy 0x0A). Napsal jsem tam špatně apostrofy - mezi apostrofy se escape sekvence v PHP nepřevede; funguje jenom mezi uvozovkami. Správně tam patří uvozovky:
if($retezec[$i]=="\n")

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: