Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko petlje

[es] :: PHP :: Pomoc oko petlje

[ Pregleda: 1805 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Pomoc oko petlje14.09.2009. u 11:33 - pre 177 meseci
Pozdrav ljudi.

Imam "delimitere" sacuvane u bazi ($arrClasif_code variabla = array)
Zatim imam neki tekst koji trebam podjelit prema tom delimiteru. E sad problem je jer trebam da mi na PRVOM delimiteru djeli taj string, a sada mi nekako nasumicno to djeli, odnosno vjerovatno po redu kako cita bazu.

Evo slika kako to izgleda: (crveno je zaokruzeno tamo gdje bi trebalo podjelit, a crnim gdje sad djeli..)
http://img98.imageshack.us/img98/2237/screenshotadrimportmozi.jpg

a sledi i kod koji konkretno to radi, ostalo mislim da nije vazno.( $arrClasif_code je array tih delimitera iz baze ).

Ako niste razumjeli pitanje objasnicu jos jednom.
Hvala unaprijed!

Code:

// Explode by reg. ex. (id) to array
    $arrDescTemp = preg_split($regEx,$text,-1,PREG_SPLIT_NO_EMPTY);

    $arrDesc = array();
    foreach($arrDescTemp as $value){
        if(strlen($value) > 3){
            // $arrClasif_code is array of possible delimiters from db^
            foreach($arrClasif_code as $delimiter){
                if(preg_match_all("/ $delimiter /",$value, $founded_dels)){
                 /////////////////  WORK MODE /////////////
                //    $a = explode("$delimiter",$value);
                //    $arrDesc[] = $a[0];
                    //////////////// DEBUG MODE ///////////
                    $desc = $value;
                    $delimiter = $founded_dels[0][0];
                    $desc = str_replace($delimiter,"<span style='font-size:20px; border:1px solid black;'>$delimiter</span>",$desc);
                    echo "Delimiter: <u style='font-size:20px;'>$delimiter</u><br>Desc je :$desc<hr>";
                //break;// when delimiter founded, break loop and start again
                /////////////// END DEBUG MODE ///////////
                }// End if delimiter from db exist in value
            }// End of loop through delimiters
        }// End of checking lenght of value
    }// End of main loop

 
Odgovor na temu

b0ris
Boris Vujicic
Senior PHP programer
Beograd

Član broj: 126587
Poruke: 158
*.dynamic.sbb.rs.



+2 Profil

icon Re: Pomoc oko petlje14.09.2009. u 12:42 - pre 177 meseci
Pitanje nije bas dobro formulisano. Probaj jos jednom da formulises pitanje.
Najbolje bi bilo da prvo napises "sta bi zeleo da postignes" a potom da napises svoje pitanje.

Probaj da izbacis html kod iz php-a (znatno ce ti biti lakse kasnije)

Prema ovoj slici koju ja vidim on deli kako treba, tacnije delimiter ti je T4 i on deli po T4 dok ti zaokruzujes F1 (pitanje je zasto bi delio po F1 ako je delimiter vec setovan na T4?)

Jedino sto moze da mi padne napamet je da bi ti zelo da se ti stringovi dele nekim redom, probaj da uradis na kraju upita "order by delimiter ". To ce da sortira taj tvoj niz iz baze.
---------------------------------------------------------------------
Just do it.
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Pomoc oko petlje14.09.2009. u 17:28 - pre 177 meseci
Ne znam u čemu je problem, bar po onome što ja vidim na toj slici. Ne znam zašto očekuješ da ako mu kao delimiter proslediš recimo taj T4, da ga on explode-uje po nečem drugom... :S

I samo jedan mali savet, taj preg_match_all ti je za takav slučaj sasvim suvišan, koristi strpos.
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dynamic.dsl.t-2.net.



+18 Profil

icon Re: Pomoc oko petlje14.09.2009. u 18:43 - pre 177 meseci
znao sam da nisam dobro objasnio

cilj ove skripte je procitat fajl, zatim explode po "\n" i zatim vrijednosti tog niza koji smo dobili sa explode podjeliti na dole objasnjen nacin.Te vrijednosti su na slici ono sto pise desno od > Desc je: <

To gore sto pise delimiter: T4 i Desc je: to je ustvari visak koji sam dodao samo za DEBUG mode. string koji ja trebam podjeliti je samo ono sto pise iza Desc je (kao sto sam vec rekao)
i to na nacin da uzmem SAMO dio koji se nalazi sa lijeve strane delimitera. Ti delimiteri (2F, F1, T1, T3...) se nalaze i u bazi i njih sam izvukao u niz. Znaci string treba da podjeli sa PRVIM delimiterom koji se poklopi sa nekim od onim u bazi/nizu.

Delimiter kojim bi u stvari TREBAO podjeliti, je random, nije uredjen.

Jel jasnije bar malo?
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Pomoc oko petlje14.09.2009. u 19:03 - pre 177 meseci
Citat:
vatri:Jel jasnije bar malo?

Malčice...

Čekaj, kad kažeš da explode-uješ po "\n", zašto bi to radio kad postoji f-ja file(), koja smešta sadržaj nekog fajla u niz, a pritom je jedan element tog niza - jedan red u tom fajlu. To je upravo ono što ti radiš tim explode-ovanje po "\n", jel tako?

E sad, ako sam dobro shvatio, ti hoćeš da kad se nađe poklapanje sa nekim delimiterom, da se tu automatski stane, i da se pređe na sledeći element iz $arrDescTemp niza, jel tako? Pa onda jednostavno odkomentariši taj break, pored koga je komentar: //when delimiter founded, break loop and start again.
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dynamic.dsl.t-2.net.



+18 Profil

icon Re: Pomoc oko petlje14.09.2009. u 19:23 - pre 177 meseci
e jbg nikola ja htio pojednostavit stvar, da ne objasnjavam sad sta se prije desava, jer nije ni bitno, al kad bas insistiras... :))
Napisao sam da razbijam po redovima fajl da bi lakse u glavi zamislili kako stvar izgleda, ali ja razbijam sa preg_match_all("/^([0-9]{4})\s/",$tekst, $matches). To sam nabrzinu napisao ne znam jel tacno, uglavnom razbija tako sto dodje do 4cifrenog broja. I ustvari zasad ne razbija fajl nego tekst koji kopiram iz fajla i unesem u formu (znam file_get_contents() ali zasad tako treba :) )

evo sad cu napisat pojednostavljeno skroz, znaci vrijednosti su drugacije ali je logika ista.
Code:

$delimiters =  array ('#', '{', '}', ' | "......);

$descriptions = array(
   'neki tekst bla bla bla # jos teksta bla } pa jos tekst tekst test',
   'drugi tekst bla bla bla } jos teksta bla | pa jos tekst tekst test',
   'treci tekst bla bla bla | jos teksta bla { pa jos tekst tekst test',
   'cetvrti tekst bla bla bla { jos teksta bla # pa jos tekst tekst test',
);


sad treba da razbijem niz descriptions tako da dobijem sledece:

$finalDesc = array(
'neki tekst bla bla bla',
'drugi tekst bla bla bla',
'treci tekst bla bla bla',
'cetvrti tekst bla bla bla');

znaci redanje delimitera u $descriptions je potpuno random kao i u $delimiters (znaci nema veze jedno sa drugim). Bitno je da samo svaki clan $descriptions-a razbije po prvom delimiteru na koji naidje a nalazi se u bazi...
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Pomoc oko petlje14.09.2009. u 21:23 - pre 177 meseci
Ok, evo kako bih ja to uradio:
Code:
$delimiters =  array('#', '{', '}', '|');
$delimitersPattern = '/[' . preg_quote(implode($delimiters)) . ']+/';

$finalDesc = array();
foreach ($descriptions as $desc) {
    $finalDesc[] = preg_split($delimitersPattern, $desc);
}

Nisam probao, al' trebalo bi da uspe... Ideja je da od tih tvojih delimiter-a napraviš pattern, koji bi izgledao ovako: /[\#\{\}|]+/, u prevodu: bilo koji broj pojavljivanja tih znakova, i onda samo sa preg_split() razbiješ te tvoje opise na delove...
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Re: Pomoc oko petlje15.09.2009. u 08:22 - pre 177 meseci
Mislim da smo na dobrom putu ali jos to nije to. Problem je jer meni delimiteri nisu ti specijalni karakteri i nisu jedan znak nego 2, 3, 4 ili 5 i to u nekoj od sledecih formi (ali opet kazem nema pravila): 1.2D, 4F, 1TOC, WFC, T1, T4, T5. Znaci sad mi treba samo da regular expression koji djeli preko ovih delimitera. Znaci delimiter i sa obe strane prazno polje (space)!

probao sam ovako ali nije dobro jer kolko vidim djeli sa svim znakovima koji se nalaze u del i sa 1, . , 2 , D , 4 , F , 1 , T , O , S... i tako dalje a meni treba iskljucivo sa tim delimiterom sa razmacima ispred i iza.

$delimitersPattern = '/ ["'.implode(' "" ',$arrClasif_code).'] +/';
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.82.*



+13 Profil

icon Re: Pomoc oko petlje15.09.2009. u 09:19 - pre 177 meseci
Aj ja da probam da se ukljucim. Jel ti ovako nesto treba:

Code:

<?php
    $delimiters = array('1.2D', '4F', '1TOC', 'WFC', 'T1', 'T4', 'T5');

    $delim = '/\s'. implode('|', $delimiters) . '\s/';

    $strings = array(
        0 => "Neki text 1.2D drugi deo ovoga ...",
        1 => "Drugi text 4F opet neki drugi deo ...",
        2 => "Ovaj text ne treba razbiti T test",
         );

    foreach($strings AS $k => $v)
    {
        $split[] = preg_split($delim, $v);
    }

    print_r($split);
?>


Rezultat:
Citat:

Array
(
[0] => Array
(
[0] => Neki text
[1] => drugi deo ovoga ...
)

[1] => Array
(
[0] => Drugi text
[1] => opet neki drugi deo ...
)

[2] => Array
(
[0] => Ovaj text ne treba razbiti T test
)

)


 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-1.sezampro.yu.



+33 Profil

icon Re: Pomoc oko petlje15.09.2009. u 09:23 - pre 177 meseci
Onda uradi ovako nešto:
Code:
foreach ($delimiters as &$dlm) {
    $dlm = '\s' . preg_quote($dlm) . '\s';
}

$delimitersPattern = '/' . implode('|', $delimiters) . '/';

Prvo ide prolazak kroz sve delimiter-e, kako bi ih escape-ovao, jer verovatno u tim delimiter-ima imaš neki specijalan karakter, npr. ta tačka, itd. A pritom im dodajem i specijalan znak "\s" sa svake strane. To je taj razmak koji ti tražiš... Posle ih implode-ujem, ali obrati pažnju da sam to sada uradio sa uspravnom crtom! To možeš da shvatiš kao onaj OR (ili) operator u PHP-u, što će reći "ako nađe poklapanje sa nekim od tih pattern-a", a ide se sa leva na desno.
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Re: Pomoc oko petlje16.09.2009. u 06:40 - pre 177 meseci
e ljudi hvala vam puno na pomoci. Problem sam rijesio, posto se sef sjetio da kaze da ima jedan fajl sa # delimiterima gdje treba da razbije :-S jbg izvinite na maltretiranju ali nije do mene bilo :)

I jos nesto da pitam dok sam tu:

@nikola: nije mi bas najjasnije koja je funkcija ove foreach petlje. Ok escape-ujes spcijalne znakove, stavljas space na pocetak i kraj, ali po meni, varijabla $dlm ce dobit vrijednost samo zadnjeg clana niza $delimiters? A to i tako kasnije ne upotrebljavas?
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Pomoc oko petlje16.09.2009. u 10:04 - pre 177 meseci
Citat:
vatri: @nikola: nije mi bas najjasnije koja je funkcija ove foreach petlje. Ok escape-ujes spcijalne znakove, stavljas space na pocetak i kraj, ali po meni, varijabla $dlm ce dobit vrijednost samo zadnjeg clana niza $delimiters? A to i tako kasnije ne upotrebljavas?

Obrati pažnju da sam stavio znak "&" ispred $dlm ($delimiters as &$dlm). A nadam se da znaš zašto i kakve su onda posledice...
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dynamic.dsl.t-2.net.



+18 Profil

icon Re: Pomoc oko petlje17.09.2009. u 19:44 - pre 177 meseci
aha sad vidim.
Znam da je se to zove referenca ali mi nije najjasnije sta radi. Citao sam po netu ali bezuspjesno :s Pretpostavljam da $dlm time postaje array ?
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Pomoc oko petlje17.09.2009. u 20:14 - pre 177 meseci
Ne, ne $dlm je i dalje element tog niza $delimiters, al' tim refenciranjem ti postižeš da promena vrednosti tog elemneta $dlm, koji se trenutno "vrti" u petlji, menja i vrednost onog pravog elementa tog niza. Isti efekat bi imao i da si napisao ovako:
Code:
foreach ($delimiters as $key=>$dlm) {
    $delimiters[$key] = '\s' . preg_quote($dlm) . '\s';
}

Razlika je što ti sada eksplicitno menjaš vrednost elementa tog niza, pozivajući se na njegov indeks ($key).

Evo ti recimo i ovaj primer:
Code:

function test(&$var)
{
    $var++;
}

$x = 7;
test($x); //$x je sada 8

Da nije bilo tog znaka "&" u definiciji funkcije test(), promenljiva $x bi i dalje imala vrednost 7 nakon poziva te funkcije, jer svaka funkcija (pa eto i foreach petlja), ima svoj opseg važenja promenljivih (scope), tako da je ta promenljiva $var sad neka promenljiva koja važi samo unutar funkcije $foo.

Imaš o svemu tome i u manual-u.
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Re: Pomoc oko petlje18.09.2009. u 06:45 - pre 177 meseci
Ma citao sam manual ali nije bas da sam razumio, sad mi je jasnije puno ono : "References in PHP are a means to access the same variable content by different names." :)
Hvala Nikola jos jednom!
 
Odgovor na temu

[es] :: PHP :: Pomoc oko petlje

[ Pregleda: 1805 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.