[php]Probleem met templateparser

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
Dmv deze parser:
PHP:
1
2
3
4
5
6
function parse ( $vars, $template )
{
    foreach ( $vars as $key => $value )
        $template = str_replace ( '{' . $key . '}', $value, $template );
    print_r($template);
}

probeer ik een template te parsen...

Dit gaat niet, omdat ik array's in een array heb zitten...
Voorbeeldje:
code:
1
2
3
4
Array ( [0] => Array ( [fname] => forum4 [fid] => 4 [fdescription] => Description4 
[fmoderator] => [fmod] => [ficon] =>  [flastpostdate] => -- [flastpost] => [cat] => 
1 [catname] => Cat1 [catdescription] => Description1 [fposts] => 0 [freplies] => 
0 ) [1] => Array (


Als k de template uit de database echo:
code:
1
2
3
4
Array
(
     [cat] => {fname}
)


Maar hij blijft steeds terugkomen met {fname} en dat komt omdat er een array in een array zit 8)7
Hoe kan ik er voor zorgen dat hij het wel goed gaat doen? :?

[ Voor 8% gewijzigd door codeweb op 23-12-2002 12:52 ]


Acties:
  • 0 Henk 'm!

  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02 01:41

Reefer

madness

Dan moet je nog in een 2e forloop elke array in die array doorlopen ?

A Breakbeat A Day Keeps Religion Away.


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
PHP:
1
2
3
4
5
6
7
8
9
10
11
function parse ( $vars, $template, $rows )
{ 
    $i = "0";
    foreach ( $vars as $key => $value )
    while ($i <= $rows) {
    foreach ( $vars[$i] as $key => $value )
        $template = str_replace ( '{'.$key.'}', $value, $template );    
        $i++;
        print_r($template);
    }
        }

ut wil niet lukken :'( hierbij krijg ik steeds dezelfde terug. er staan er 6 in

Acties:
  • 0 Henk 'm!

  • smaij
  • Registratie: November 2000
  • Laatst online: 18-09 10:44
$i = "0"; kan je beter $i = 0; van maken, staat wat 'netter' Voorderest gebruik je iets verkeerds

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function parse ( $vars, $template, $rows ) 
{  
    foreach ( $vars as $key => $value ) {
     $i = 0; 
     while ($i <= $rows) { 
     foreach ( $vars[$i] as $key => $value ) 
        $template = str_replace ( '{'.$key.'}', $value, $template );     
        $i++; 
     }
    }
    print_r($template); 
}

Misschien bedoel je zoiets? :S

Wat bevat $template en $rows nou precies.. leg het nog is uit als het kan..

[edit]
dat iets verkeerds bedoelde ik mee $i had je boven je foreach van de 1ste array gezet..

[ Voor 14% gewijzigd door smaij op 23-12-2002 14:21 ]


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
misschien recursief?
dan kun je een onbeperkt aantal niveaus in je arrays hebben.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function parse($vars, $template) 
{ 
    foreach ($vars as $key => $value)
    {
        if (is_array($value))
        {
            $template = parse($value, $template);
        }
        else
        {
            $template = str_replace('{' . $key . '}', $value, $template); 
        }
    }
    return $template;
}

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
$template bevat bij deez:
Array
(
[cat] => {fname}
)

$rows bevat het aantal keer dat de 2e array in de 1e zit:

array([0] = array(....
en dat tot [5]
Zo beter uitgelegd?
zal ik nog even de andere manieren proberen

[ Voor 3% gewijzigd door codeweb op 23-12-2002 17:04 ]


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
smajj: ik krijg Warning: Invalid argument supplied for foreach() op de regel van foreach ( $vars[$i] as $key => $value )

Apollo_Futurae: als ik ipv dat return $template print_r($template) maak, zie ik er maar 1. En dat is hoe ik het ook probeer te veranderen steeds dezelfde...

[ Voor 15% gewijzigd door codeweb op 23-12-2002 17:57 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je bent zeker geen forum aan het maken? :P

Ik heb hier bijna exact hetzelfde stukje code voor een template parser, maar ik ben nog nooit tegen het probleem aangelopen meerdere dimensies tegelijk te moeten parsen. Als je dat wel moet kunnen geeft Apollo_Futurae je een prima tip :)

Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
misschien hebben jullie er wat aan als ik de array even geef, waar hij de data vandaan moet halen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Array
(
    [0] => Array
        (
            [fname] => forum4
            [fid] => 4
            [fdescription] => Description4
            [flastpostdate] => --
            [flastpost] => <a href='index.php?act=topic&tid=0'></a>
            [cat] => 1
            [catname] => Cat1
            [catdescription] => Description1
            [fposts] => 0
            [freplies] => 0
        )

    [1] => Array
        (
            [fname] => forum3
            [fid] => 3
            [fdescription] => Description3
            [flastpostdate] => --
            [flastpost] => <a href='index.php?act=topic&tid=30'>Robin</a>
            [cat] => 1
            [catname] => Cat1
            [catdescription] => Description1
            [fposts] => 0
            [freplies] => 0
        )

    [2] => Array
        (
            [fname] => Forum1
            [fid] => 1
            [fdescription] => Description1
            [flastpostdate] => 22/12/02 - 17:31:08
            [flastpost] => <a href='index.php?act=topic&tid=2'>Robin</a>
            [cat] => 1
            [catname] => Cat1
            [catdescription] => Description1
            [fposts] => 2
            [freplies] => 0
        )

    [3] => Array
        (
            [fname] => Forum2
            [fid] => 2
            [fdescription] => Forum2
            [flastpostdate] => --
            [flastpost] => <a href='index.php?act=topic&tid=0'></a>
            [cat] => 2
            [catname] => cat2
            [catdescription] => Description2
            [fposts] => 0
            [freplies] => 0
        )

    [4] => Array
        (
            [fname] => forum5
            [fid] => 5
            [fdescription] => Description5
            [flastpostdate] => --
            [flastpost] => <a href='index.php?act=topic&tid=0'></a>
            [cat] => 3
            [catname] => cat3
            [catdescription] => description3
            [fposts] => 0
            [freplies] => 0
        )

    [5] => Array
        (
            [fname] => forum6
            [fid] => 6
            [fdescription] => Description6
            [flastpostdate] => --
            [flastpost] => <a href='index.php?act=topic&tid=0'></a>
            [cat] => 4
            [catname] => cat4
            [catdescription] => description4
            [fposts] => 0
            [freplies] => 0
        )
)


bij de methode van Apollo_Futurae krijg ik alleen de 1e goed te zien, de rest komt niet...
dan krijg ik dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Array
(
    [catend] => </table>
    [cat] => <tr>
<td colspan="6" id="cat"><a href="index.php?act=cat&cid=1">Cat1</a>
<br><font size="1">Description1</font></td></tr>
<tr><th></th><th>Forum:</th><th>Topics:</th><th>Replies:</th>
<th>Last post:</th><th>Moderator:</th></tr>
    [show_forum] => <tr>
    <td width="2%">[img]"images/no-new-posts.jpg"></td>
[/img]<a href="?act=forum&fid=4&order=id&by=asc">forum4</a>
<br>Description4</td>
    <td width="6%">0</td>
    <td width="6%">0</td>
    <td width="20%">On: --<br>by: <a href='index.php?act=topic&tid=0'></a></td>
    <td width="10%"><a href='index.php?act=members&pid=0'></a></td>
  </tr>
    [catheader] => <table id="table" cellspacing="0" cellpadding="4" border="1" 
bordercolor="#919191" width="720">
)

[ Voor 214% gewijzigd door codeweb op 23-12-2002 18:03 ]


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
inderdaad; ik dacht dat je een meerdimensionale array had gevuld met variabelen die allemaal ingevuld moeten worden.
je hebt dus meerdere versies van dezelfde templatevariabelen? wat wil je daar dan mee doen? je zult toch moeten kiezen welke informatie je wilt invullen voor bij voorbeeld {fid}.

als je steeds hetzelfde template wilt laten zien met telkens andere templatevariabelen, zou je zoiets moeten doen:
PHP:
1
2
3
4
5
6
foreach ($varss as $key => $vars)
{
    $resultaten[$key] = parse($vars, $template);
}

print_r($resultaten);

maar ik weet niet zeker of je dit bedoelt :?

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

Verwijderd

lol, dat is dus exact hetzelfde als wat ik hier heb ja :D

Ik loop er dan zo doorheen: (bijvoorbeeld ervanuit gaand dat de template 1 < tr > bevat met daarin bijvoorbeeld gegevens over een thread:

PHP:
1
2
3
for($i=0;$i<count($array); $i++) {
  template_parser_functie($array[$i], "naamvantemplate");
}

maar ik weet ook niet zeker of je dit bedoelt :)

Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
Apollo_Futurae schreef op 24 December 2002 @ 15:32:
inderdaad; ik dacht dat je een meerdimensionale array had gevuld met variabelen die allemaal ingevuld moeten worden.
je hebt dus meerdere versies van dezelfde templatevariabelen? wat wil je daar dan mee doen? je zult toch moeten kiezen welke informatie je wilt invullen voor bij voorbeeld {fid}.

als je steeds hetzelfde template wilt laten zien met telkens andere templatevariabelen, zou je zoiets moeten doen:
PHP:
1
2
3
4
5
6
foreach ($varss as $key => $vars)
{
    $resultaten[$key] = parse($vars, $template);
}

print_r($resultaten);

maar ik weet niet zeker of je dit bedoelt :?
zat er toenstraks in de buurt :P
nog ff een typo weggewerkt en het werkt :D:D
tnx

Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
om hier toch nog even op terug te komen: heb ondertussen een volgende probleem wat hier denk k wel mee te maken heeft:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$i=0; $a=0; $v=0;
while($i <= count($template)) {
echo $template[$i][$a][catheader]."\n";
echo $template[$i][$a][cat]."\n";
while($v < count($template[$i]))
{  
echo $template[$i][$v][show_forum];
$v++; 

}
$a = $a+count($template[$i]);
echo $template[$i][0][catend];
$i++;
}


Nu krijg ik wel alle cats te zien, alleen krijg alleen in de 1e cat de forums te zien.
Het komt erop neer, dat hij die $v niet opnieuw gebruikt. Maar ik ben nu al een tijdje aan het rommelen geweest, maar ik kan het er maar niet uitkrijgen 8)7 8)7

Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
1) quote je named arrays: ['cat'] i.p.v. [cat]
2) error_reporting (E_ALL)
3) indent je code (of wordt je indentation vernaggeld door React?)
4) gebruik i.p.v. while foreach met logische lokale-variabelenamen (foreach ($templates as $templatekey => $template) {} )

als je dit allemaal netjes doet, hoef ik je ook niet meer te vertellen dat $v=0; binnen je buitenste while-loop moet staan...

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
heb nu ff tijd gehad om het na te kijken. Heb nu onder andere foreach gebruikt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
foreach ($template as $key => $value)
{
    foreach ($value as $key => $value)
    {
    if($lastcat != $value['cat'])
    {
        if($lastcat != "") 
        {
            echo $value['catend'];
        }
        echo $value['catheader'];
        echo $value['cat'];                     
    }
    echo $value['show_forum'];
    $lastcat = $value['cat'];
    }
}
echo $value['catend'];

En nu werkt het :)
bedankt voor alle advies :D
Pagina: 1