Open clphillips opened 12 years ago
The next template's syntax was wrong.
{{ b.{{ a.x }} }}
You can use nested "for" tag instead of nested "{{ }}" tag like below or prepare ordered $b array in php code.
<ul>
{% for a in arr %}
{% for i, b_val in b %}
{% if i == a.x %}
<li>{{ b_val }}</li>
{% endif %}
{% endfor %}
{% endfor %}
</ul>
Thanks superdaigo. The example you provided works, however it is extremely inefficient (O(n^2): nested loop, can't break after item found).
Here's what I'm looking for in PHP for comparison:
foreach ($arr as $a) {
echo $b[$a['x']];
}
Hi, clphillips. It's true that the nested "for loop" is inefficient and deep nest was evil. If you worry about the efficiency, here is two solutions.
Create ordered variables before render to template.
$arr = array(
array('x' => 0),
array('x' => 1),
array('x' => 2),
array('x' => 3),
);
$b = array(1, 2, 3, 4);
// prepare
$b_ordered = array();
foreach ($arr as $a) {
$b_ordered[] = $b[$a['x']];
}
// render
h2o->render(array( 'b_new' => $b_ordered ));
{% for b_val in b_new %}
{{ b_val }}
{% endfor %}
The "h2o" is fast and simple template engine. I think something complex should be done in PHP code.
Thanks again superdaigo.
You solution in #1 is exactly what I did as a work around. I'm still concerned with it, because if you analyze the run time (PHP + h2o) it's still a nested loop (O(n^2)). However, it gets the job done and keeps the template simple and easy to understand (which is why we chose h2o to begin with). :)
Assume the following:
Expected output:
1 2 3 4
Actual output: unexpected character in filters : "." at 306 on line 228 in /h2o/h2o/parser.php
(edited to clarify variable tags)