Template parser - array

Gledam i gledam, mjenjam, tražim, patim se, ali nema rješenja. Znači imam klasu s kojom parsiram templejt. Naprimjer:

[php]<?php

$tpl->cache_vars(‘variable’, ‘Some value’);

$tpl->display(‘template’);

/**

  • HTML kod je: {variable}
  • output je: Some value
    */

?>[/php]

A zanima me kako da napravim parsiranje niza. Npr:

[php]<?php

$array[] = array(‘variable’ => ‘Some value’, ‘variable2’ => ‘Some other value’);
$array[] = array(‘variable’ => ‘Some value 2’, ‘variable2’ => ‘Some other value 2’);

$tpl->cache_vars(‘varijabla’, $array);

$tpl->display(‘template’);

/**

  • HTML kod bi bio:
  • {varijabla}
  •  <p>{variable}</p>
    
  •  {variable2}
    
  •  <hr />
    
  • {/varijabla}
  • output bi bio:
  • Some value

  • Some other value

  • Some value 2

  • Some other value 2
    */

?>[/php]

Našao sam {varijabla} i {/varijabla}, no kako parsirati ono unutar toga.

[php]$pattern = ‘|{’ . $key . ‘}’ . ‘(.*?)’ . ‘{/’ . $key . ‘}’. ‘|s’[/php]

Za parsiranje jednog stringa koristim normalno:
[php]str_replace(’{’ . $key . ‘}’, $val, $string)[/php]

gdje su $key i $val elementi iz niza $cached_vars

Imaš dvije opcije - regexp ili najobičniji foreach loop.

EDIT: BTW, str_replace() ti također podržava array kao prvi i drugi argument, ali onda moraš zasebno dodati zagrade (’{}’) na keys.

Foreachom cu samo zamjeniti {variable} i {variable2}, kad dodje zadnji element iz niza $array, zamjenit ce prethodni sa tim (ako koristim str_replace). HTML kod stranice se sprema u svojstvo $output = ob_get_contents()

Ako i je foreach, moze primjer istog?

EDIT: Znam da str_replace podrzava, ali mi je ovako jednostavnije…

Ako sam te dobro shvatio, ti želiš svaki slijedeći str_replace() raditi na stringu koji je promijenio prethodni str_replace(). To možeš ovako;

foreach ($array as $str => $value)
{
$string = str_replace($key, $value, $string);
}

[quote=“voajer”]Ako sam te dobro shvatio, ti želiš svaki slijedeći str_replace() raditi na stringu koji je promijenio prethodni str_replace(). To možeš ovako;

foreach ($array as $str => $value)
{
$string = str_replace($key, $value, $string);
}[/quote]

Ne, već da mi neradi na prethodnom.

[php]<?php

$array[] = array(‘variable’ => ‘Some value’, ‘variable2’ => ‘Some other value’);
$array[] = array(‘variable’ => ‘Some value 2’, ‘variable2’ => ‘Some other value 2’);

$tpl->cache_vars(‘varijabla’, $array);

$tpl->display(‘template’);

/**

  • HTML kod bi bio:
  • {varijabla}
  •  <p>{variable}</p>
    
  •  {variable2}
    
  •  <hr />
    
  • {/varijabla}
  • output bi bio:
  • Some value

  • Some other value

  • Some value 2

  • Some other value 2
    */

?> [/php]

S tim kodom tvojim bi dobio ovaj output umjesto onog koji zelim:
[php]/**

Some value 2 (jer je Some value 2 zadnji $val iz tog niza)

Some other value 2 (jer je i to zadnji $val iz tog niza)[/php]

[quote=“jojo”]
S tim kodom tvojim bi dobio ovaj output umjesto onog koji zelim:
[php]/**

Some value 2 (jer je Some value 2 zadnji $val iz tog niza)

Some other value 2 (jer je i to zadnji $val iz tog niza)[/quote]

Da, to je točno. str_replace() ti je zamjenio vrijednost iz drugog array-a. Ako želiš iz prvog, onda moraš str_replace sa $array[0], a ne $array.

Okej, mislim da sam skužio što želiš;

Evo koda;

<?php 
$array[] = array('variable' => 'Some value', 'variable2' => 'Some other value');
$array[] = array('variable' => 'Some value 2', 'variable2' => 'Some other value 2'); 

$string = '{varijabla}
<p>{variable}</p>
 
{variable2}
<hr />
{/varijabla} ';

$str1 = $string; 

foreach ($array[0] as $key => $value)
{
	$str1 = str_replace('{' . $key . '}', $value, $str1);
}

$str2 = $string;

foreach ($array[1] as $key => $value)
{
	$str2 = str_replace('{'.$key.'}', $value, $str2);
}

echo $str1 . $str2;

?>

EDIT: Testirao i ispravio kod, sada izbacuje:

{varijabla}
<p>Some value</p>
 
Some other value
<hr />
{/varijabla} {varijabla}
<p>Some value 2</p>
 
Some other value 2
<hr />
{/varijabla}

Svaka iteracija mora raditi na stringu koji je promijenila prošla, a ne na originalu.

Eeeee to :slight_smile: Samo kako da napravim da za svaki element, ako ih ima milijun da za svaki automatskit o radi, a ne da ja moram pisat foraech ($array[element] etc etc

To ti je već problem dizajna a ne samog koda. Osobno mi je došlo da si iskopam oči kada sam vidio kako je ovo organizirano.

Kao vatrogasnu mjeru možeš probati ovo:

$total = '';

foreach ($array as $subarray)
{
$temp = $string;

foreach ($subarray as $key => $value)
{
$temp = str_replace('{'.$key.'}', $value, $temp);
}

$total .= $temp;
}

echo $total;

Uh, napokon sam sredio, hvala :slight_smile:


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja