Variable access to array index
Assume the following:
$arr = array(
array('x' => 0),
array('x' => 1),
array('x' => 2),
array('x' => 3),
);
$b = array(1, 2, 3, 4);
{% for a in arr %}
{{ b.{{ a.x }} }}
{% endfor %}
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)
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 %} -
Create custom tags or extensions. ... It's not easier than above and probably too much ...
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). :)