Co jste možná nikdy neřešili – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Co jste možná nikdy neřešili – PHP – Fórum – Programujte.comCo jste možná nikdy neřešili – PHP – Fórum – Programujte.com

 

Odkin
~ Anonymní uživatel
10 příspěvků
4. 1. 2014   #1
-
0
-

Zdravím, snad se mi tu aspoň někdo ozve...

Zrovna začínám s PHP a zarazila mě existence funkcí jako substr nebo strrev. Rozumím jejich využití při práci se stringem, ale nějak jsem se nikde nedočetl na jakém principu vlastně fungují (algoritmus těch funkcí).

Při tom jsem si i uvědomil, že se v žádném návodu nepíše, jak přímo převádět string na integer. A teď nemluvím o řetezci. – I když se STRING vypisuje jako sada znaků, tak se vlastně jedná o číslo (INTEGER) převedené na znaky. Jak mám toto číslo (s kterým počítač pracuje) vytáhnout?

Pokud dokážete odpovědět i jen na jednu otázku, tak mi vážně pomůžete. :) A jestli nevíte, tak jsem narazil na díru v samotné podstatě vašich znalostí. :P

Nahlásit jako SPAM
IP: 213.191.98.–
Kit+15
Guru
4. 1. 2014   #2
-
0
-

#1 Odkin
Narazil jsi na díru v samotné podstatě svých znalostí, protože jsi nezformuloval jasně ani jednu otázku a zřejmě si pleteš pojmy číslo a číslice. Navíc string není číslo.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
4. 1. 2014   #3
-
0
-

retezce jsou jen hromady bajtu v pameti za sebou ... na hledani podretezce jsou algoritmy (google ti bude urcite napomocen)

a prevody retezcu na cisla a naopak jsou jen obycejny prevody mezi soustavama - z binarni na desitkovou s ruznejma zpusobama ukladani a naopak (zase google)

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Odkin
~ Anonymní uživatel
10 příspěvků
5. 1. 2014   #4
-
0
-

Google mi právě že moc nápomocný není a není to proto, že bych neuměl hledat.

"String není číslo" a "retezce jsou jen hromady bajtu v pameti za sebou", to samozřejmě vím. Ale slova jako řetězec používají jen lidi, když o tom mluví. Stroj ty bajty bere jako číslo (ve dvojkové soustavě), které přepočítává na znaky teprve když je má vykreslit. Snažím se získat přístup k tomuhle číslu, jestli to tak mám podat.

Z téhle informace bych už ty algoritmy vytáhnout dokázal.

Nahlásit jako SPAM
IP: 213.191.98.–
Kit+15
Guru
5. 1. 2014   #5
-
0
-

#4 Odkin
My ti prostě nerozumíme. Napiš sem raději co máš na vstupu a co z toho chceš dostat na výstupu.

Nadpis příspěvku je tajemný jako hrad v Karpatech. Co má společného "Co jste možná nikdy neřešili" s PHP? Naprosto mlhavé otázky, ve kterých si pleteš pojmy. Co si myslíš, že dostaneš jako odpověď na otázku "Co jste možná nikdy neřešili"?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Odkin
~ Anonymní uživatel
10 příspěvků
6. 1. 2014   #6
-
0
-

OK, zkusím to jinak.

Existuje tabulka ASCII, která obsahuje běžně používané znaky pro 7 bitů dat. V praxi se sice mimo asijské země používá 8 bitů na znak, ale to teď dám stranou.

My (lidé) vnímáme STRING jako text, slova, atd, ale pro stroj, který ho vykresluje, se jedná o číslo ve 128čkové soustavě (tedy data jsou přímo brána jako číslo).

Já se vás v podstatě ptám, jak to mám v PHP udělat, aby mi R (string) vypsal jako 82 (integer).

A teď nehledám algoritmus. To by byla ztráta času. Chci přímo vzít data ve stringu a vypsat je jako číslo, aby to bez problému vzalo i 8 bitů.

-----------

S přístupem k tomuto číslu bych si už dokázal představit algoritmy substr nebo strrev.

Nahlásit jako SPAM
IP: 213.191.98.–
Kit+15
Guru
6. 1. 2014   #7
-
0
-

#6 Odkin
Aha, ty chceš ordinální hodnotu znaku.

<?php
$cislo = ord('R');

Není to však odpověď na otázku "Co jste možná nikdy neřešili", ale to ti snad nebude vadit.

Nahlásit jako SPAM
IP: 195.113.151.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Odkin
~ Anonymní uživatel
10 příspěvků
6. 1. 2014   #8
-
0
-

Díky, tohle by možná mohlo být ono.

Ale vypadá to pořád jako funkce. Jsi si jistý, že je to čistý přístup k datům a ne jen další algoritmus? Trochu jsem po tom zapátral a ord se běžně používá pro intervaly, které musí odkazovat na svůj zdroj...

Jak můžu upravenou hodnotu přenést okamžitě zpátky? A bude to fungovat i na sadu znaků? Moc se mi to nezdá.

V sedmibitové ASCII by $string = "I'm not sure." měla odpovídat číslu 1418047858304405663494484654 (data dvojkové soustavy převedena na desítkovou). Tohle mi to nejspíš nevyplivne...

--------------

Když nad tím tak přemýšlím, to číslo se do integeru ani nevejde. :D Asi to vyžaduje pohyblivý interval. (Pane Bože co jsem to zas vymyslel.)

Nahlásit jako SPAM
IP: 213.191.98.–
Odkin
~ Anonymní uživatel
10 příspěvků
6. 1. 2014   #9
-
0
-

P. S. Aby bylo jasno, pořád chci pracovat s tím číslem, akorát nevím jak, aby mi to PHP dovolil.

Nahlásit jako SPAM
IP: 213.191.98.–
dzejkob
~ Anonymní uživatel
7 příspěvků
6. 1. 2014   #10
-
0
-

Php funguje na vyšší úrovni a nemůžete předpokládat, že ve standardním (i nestandardním) api najdete něco analogického, jako je třeba char * str v c++, kde si můžete vytáhnout znak z řetězce, přetypovat ho na ukazatel na objekt a nechat díky tomu spadnout program. Php si prostě string nějak ukládá a přistupovat k němu můžete pouze přes funkce, co dává k dispozici. Pokud tedy chcete ascii kód znaku, musíte použít ord($str[5]) nebo ord(substr($string, 5, 1)). Ascii kód znaku převedete zpátky funkcí asc().

Nahlásit jako SPAM
IP: 82.113.52.–
Odkin
~ Anonymní uživatel
10 příspěvků
6. 1. 2014   #11
-
0
-

Celá tahle "debata" vznikla na tom, že každá funkce nějak funguje a substr evidentně pracuje se stringem jako s číslem.

Samozřejmě, že je jednodušší používat předem připravené funkce a jejich kombinace, ale to pak probíhají některé podoperace zbytečně, což se může projevit při zpracovávání velkého množství dat.

Proto jsem založil tohle vlákno, abych se dozvěděl, jak můžu string přimět, aby se choval jako číslo ve 256tkové soustavě, kterým doopravdy je. Já vím přesně, jak php string ukládá a proto se divím, že neexistuje jednoduchá odpověď jako "$&string obejde zákazy".

Nahlásit jako SPAM
IP: 213.191.98.–
KIIV
~ Moderátor
+43
God of flame
6. 1. 2014   #12
-
0
-

#11 Odkin
a z jakyho duvodu by se takova funkce mela chovat tak jak ty myslis? Pismena srovnat jdou a presne to tydle funkce delaj. Jen to musi delat rekurzivne - pokud narazi na neshodu nedkde v hledanem retezci, tak proste posunou zacatek o jedno dal a srovnavaj

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dzejkob
~ Anonymní uživatel
7 příspěvků
6. 1. 2014   #13
-
0
-

Se vší úctou, pokud víte, jak PHP pracuje se stringy, už si dávno píšete svoji vlastní extenzi, která zvládá vaše požadavky a neptáte se tady na fóru. Protože se ptáte, tak to patrně nevíte. Takže máte buď možnost používat nativní PHP funkce, nebo si napsat extenzi v c++, nebo použít jiný jazyk.

Nahlásit jako SPAM
IP: 82.113.52.–
Odkin
~ Anonymní uživatel
10 příspěvků
6. 1. 2014   #14
-
0
-

dzejkob: Mluvil jsem o datové podobě ukládání, že to není jen "nějak". Vím, že to vyznělo mylně až namyšleně, ale už jsem to po odeslání neměl možnost opravit...

Chtěl jsem tím říct, že string je na 100% vypisován jako 256kové číslo. Další detaily kolem teď nejsou důležité, chci jen získat přístup k těm datům, abych mohl měnit jejich obsah pomocí matematiky.

KIIV: Nejsem si úplně jistý, jestli rozumím, jaký algoritmus navrhuješ, ale pokud by to měl počítač vážně takhle zkoušet, tak na tom ztratí tolik času, že by to bylo u delších textů znatelně cítit.

Hlavně není důvod k tak extrémním činům "jen abych našel jiný způsob". Každý programátor rád přijme funkci z knihovny a už se nestará jak dlouhá a komplexní může doopravdy být. Mě to zajímá, abych kód urychlil na jeho úkor čitelnosti.

Nahlásit jako SPAM
IP: 213.191.98.–
KIIV
~ Moderátor
+43
God of flame
6. 1. 2014   #15
-
0
-

#14 Odkin
tak kdyz vymyslis neco lepsiho, pocitacovy svet ti pogratuluje... (samozrejme existuji urcite moznosti jak zrychlit to testovani, zda je ci neni retezec co chces - muze se jit od zacatku a od konce hledaneho retezce "zaroven")

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
HonzaMac
~ Anonymní uživatel
1 příspěvek
7. 1. 2014   #16
-
+1
-
Zajímavé

#14 Odkin
No a co takové 

 $cislo = (int) "8654321"; 

Pak s tím bude php pracovat jako s číslem a ne jako se stringem.

Pak existuje i funkce na výpis v konkrétní soustavě http://cz1.php.net/manual/en/function.sprintf.php

Ale pořád nedostanete přístup k adrese paměti. 

Případně pak ještě  base_convert() http://cz2.php.net/manual/en/function.base-convert.php k převodu do jakekoliv soustavy. klidně i do té vaší "256kové"

Zde můžete vidět asi nejmožnější low-level práci s řetězci pro hashovací funkci md5 

Nahlásit jako SPAM
IP: 88.101.77.–
Odkin
~ Anonymní uživatel
10 příspěvků
7. 1. 2014   #17
-
0
-

Původně jsem doufal, že řešení bude takhle jednoduché, ale $cislo = (int) "8654321" mi vrátí číslo 8654321. Já potřebuju, aby mi to v tomhle případě vrátilo 15822200832733745, což je datový obsah tohoto stringu braný jako číslo.

Integer by už samozřejmě přetekl, (nejen) proto chci pomocí matematiky měnit tuto datovou hodnotu přímo, bez zbytečných algoritmů, které by postup zdržovali.

----------------------

Zkusím dát jiný příklad - mějme vstup:

$text = "hoj";

String využívá osmi bitů, proto se tato data uloží jako:

011010000110111101101010

To odpovídá číslu:

6844266

Když teď provedu matematický výpočet, vyjde mi například číslo:

6582122

To v datech odpovídá:

011001000110111101101010

Pokud teď data vypíšu jako string, dostanu výstup:

doj

O to mi jde.

Nahlásit jako SPAM
IP: 213.191.98.–
ench0
Stálý člen
7. 1. 2014   #18
-
0
-
Nahlásit jako SPAM
IP: 77.242.90.–
I programování je pudová záležitost. Buď to pude, nebo to nepude
dzejkob
~ Anonymní uživatel
7 příspěvků
7. 1. 2014   #19
-
0
-

Vždyť to nikdo nepochybuje, že znak stringu je číslo. Nedá se k němu ovšem přistupovat jinak, než přes php funkce. Tedy udělat něco jako:

$codes = array();

for ($f = 0, $len = strlen($str); $f < $len; $f++) {

  $codes[] = ord($str[$f]);
}

A v $codes budete mít pole ascii kódů znaků daného stringu a s nimi dělat bitové operace (ty PHP umí). Nebo můžete zkusit ten pack. Ovšem žádné lepší nástroje v php nemáte. Pokud chcete psát nízkoúrovňové efektivní algoritmy co pracují se stringy, a má to pro vás z nějakého důvodu smysl, pak si napište extenzi do PHP v c++:

http://php.net/manual/en/internals2.php

Nahlásit jako SPAM
IP: 82.113.52.–
Odkin
~ Anonymní uživatel
10 příspěvků
7. 1. 2014   #20
-
0
-

Ench: Moje angličtina není nejhorší, ale nejsem si úplně jistý jak ta (zase) funkce funguje. Pochopil jsem to tak, že rozbalí string na znaky a ty pak udržuje v binárním kódu. ??? I tohle je zmiňované zdržování, ačkoli to už není takový rozdíl...

Ráno jsem musel jít na hodinu, tak jsem nestihl napsat, jakým způsobem bych tu proměnnou upravil, aby to změnilo hoj na doj.

$string = $string-($string/65536)*65536+6553600;

To je všechno. Kdyby mi to PHP vzalo, tak tenhle řádek změní první písmeno v jakémkoli stringu o třech znacích na d. Žádné okliky, žádné funkce, i když je to dost specifická situace.

Podobně jednoduché vzorce mě ale napadají pomalu na jakoukoli práci se stringem a strašně mě žere, že je nemůžu používat a musím místo nich hledat a kombinovat funkce.

dzejkob: Stále mi to opakujete a já tomu stále nemohu uvěřit. :) Jen protože se to běžně nepoužívá  neznamená, že to neexistuje. Už se tu objevilo mnoho funkcí, o kterých jsem neměl ani ponětí, protože jsem je nepotřeboval.

Té extenzi jsem bohužel vůbec neporozuměl. :(

Nahlásit jako SPAM
IP: 213.191.98.–
KIIV
~ Moderátor
+43
God of flame
7. 1. 2014   #21
-
0
-

a co bys v takovem pripade delal, kdyz bys mel vymenit neco delsiho? Maximum v programovacich jazycich byva uint64 coz znamena 8B.. co kdyz budes chtit vymenovat neco mnohem delsiho?

proste to co resis, nema realny uplatneni... beztak ty znaky uz davno cisla v ram jsou

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Odkin
~ Anonymní uživatel
10 příspěvků
8. 1. 2014   #22
-
0
-

"beztak ty znaky uz davno cisla v ram jsou"

Právě proto je chci požívat k výpočtům bez zbytečných oklik. Uplatnění v praxi je naopak veliké protože:

a) Nemusím shánět funkci a "štelovat ji". Vzorec si dokážu napsat sám na jakoukoli situaci a můžu ho uvést v nejrychleji vypočítatelné podobě.

b) Vidím mnohem hlouběji do struktury programu. Nemůže mě překvapit žádný neočekávaný vstup, protože vždycky vím, co to vypočítá.

c) String využívá určitý algoritmus na principu array, takže tak snadno nepřeteče.

Nahlásit jako SPAM
IP: 213.191.98.–
Ovrscout
~ Anonymní uživatel
112 příspěvků
9. 1. 2014   #23
-
0
-

nemůžu odolat a trosku si taky zaflejmuju tady :)

1)Pokud chcete dělat nízkoůrovňové optimalizace tohoto typu nebude php zrovna vhodné. (asi jako vodní dělo na zalití malého květináče). Skuste C/C++ či asembler tam jsou takovéto optimalizace jednodušeji realizovatelné, používají se a někdy mají i smysl.

2)String je obecně entita která umožňuje udržovat a pracovat s krátkýmy i dlóóouhými řetězcy znaků které nejde je ve "Stroji" vyjádřit a zpracovávat jako jedno jediné číslo. Jak už někdo psal tak do největšího registru ,čísla s kterým umí stroj pracovat (64bitů), se vejde jen pár znaků. 2..8 podle použitého kódování. Proto se s Stringem ve stroji pracuje jako s polem hodnot/bajtů nikoliv jako s jedním číslem. Jinak řečeno "Stroj" není ideální matematický aparát ale má konkrétní možnosti a omezení. Takže například neumí přímo počítat(+,-,*,/,...) s tisícibitovými hodnotami. To už je pak zálečitostí různých chytrých algoritmů který takový výpočet provádějí po částech, v extrémním případě jako je tento si představte funkci substr.

3)Doporučuji rozšířit repertoár matematických operací o bitové AND,OR,XOR,LSHIFT,RSHIFT.  Pro Stroj jsou většinou výrazně efektivnější a pro člověka je to mnohem pochopitelnější. Také pro zápis dloouhých čísel se často používá hexadecimální soustava.  Obzvlášť ve spojení s funkcemi výše se pak dají dělat jednoduše různá kouzla.

Nadruhou stranu než dělat čtyři matematické operace nad číslem, je pro Stroj mnohdy jednoduší a rychlejší přistoupit k části toho čísla jako k 8bitové/1bajtové hodnotě (v RAM jsou čísla uložena,a jdou adresovat, po jednotlivých byte) a udělat jednu jednoduchou operaci (jako například při změně hoj na doj) stačí odečíst od první byte řetězce číslo 4.

4)Jednoduchost matematických operací je možná jen pokud je string jednoduše vyjádřen vnějakém pevném kódování 1znak=Nbyte nebo obecně Nbit kde N je konstanta např ASCII/UTF32. Zkuste kouknout na UTF8 kde jsou znaky v řetězci(Stringu) vyjádřovány různým počtem bitů/bajtů.
Třeba mne ale jako nematematika překvapíte.

Nahlásit jako SPAM
IP: 193.165.79.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Změna CPU - možná? — založil Troja

Jste panic? :D — založil Rambler

Jak by jste řešili? — založil Radon

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý