From a77a2ec58947f5fc7cb4023db3b8f8298e2f01f2 Mon Sep 17 00:00:00 2001
From: Kevin Chabowski
This code will loop through the array <ste:foreach array="foo" key="k" value="v" counter="i">
Number: $i<br />
Key: $k<br />
Value: $v<br />
<br />
</ste:foreach>foo
and return the counter $i
, the key $k
and the value $v
of the current iteration.
+ There can also be an optional <ste:else>
clause, that will be executed, if the input array was empty.
+
+ Example:
+
+ This code will list all array elements or will display <ste:foreach array="foo" value="v">
<p>$v</p>
<ste:else>
Array \$foo is empty.
</ste:else>
</ste:foreach>Array $foo is empty
if the array $foo
is empty.
+
Creates an infinitive loop. You can get out of the loop using the ste:break tag. Can be used to emulate other loop constructs like while loops.
diff --git a/ste.php b/ste.php index 3715435..018d754 100644 --- a/ste.php +++ b/ste.php @@ -887,14 +887,29 @@ $ste_builtins = array( $loopbody .= "\$${loopname}_counter++;\n\$ste->set_var_by_name(\$${loopname}_countervar, \$${loopname}_counter);\n"; } + $loop = array(); + $else = array(); + foreach($ast->sub as $node) { + if(($node instanceof TagNode) && ($node->name == "else")) { + $else = array_merge($else, $node->sub); + } else { + $loop[] = $node; + } + } + $loopbody .= "\$ste->set_var_by_name(\$${loopname}_valuevar, \$${loopname}_value);\n"; if(!empty($ast->params["key"])) { $loopbody .= "\$ste->set_var_by_name(\$${loopname}_keyvar, \$${loopname}_key);\n"; } $loopbody .= "\n"; - $loopbody .= _transcompile($ast->sub); + $loopbody .= _transcompile($loop); $loopbody = "{\n" . loopbody(indent_code($loopbody)) . "\n}\n"; + if(!empty($else)) { + $code .= "if(empty(\$${loopname}_array))\n{\n"; + $code .= indent_code(_transcompile($else)); + $code .= "\n}\nelse "; + } $code .= "foreach(\$${loopname}_array as \$${loopname}_key => \$${loopname}_value)\n$loopbody\n"; return $code; @@ -1351,13 +1366,15 @@ class STECore { } private function &_get_var_reference(&$from, $name, $create_if_not_exist) { + $nullref = NULL; + $bracket_open = strpos($name, "["); if($bracket_open === false) { if(isset($from[$name]) or $create_if_not_exist) { $ref = &$from[$name]; return $ref; } else { - return NULL; + return $nullref; } } else { $old_varname = $varname; @@ -1371,7 +1388,7 @@ class STECore { if($create_if_not_exist) { $from[$varname] = array(); } else { - return NULL; + return $nullref; } } try { diff --git a/tests/test_foreach/.gitignore b/tests/test_foreach/.gitignore new file mode 100644 index 0000000..de2a41b --- /dev/null +++ b/tests/test_foreach/.gitignore @@ -0,0 +1,3 @@ +have +*.ast +*.transc.php diff --git a/tests/test_foreach/code.php b/tests/test_foreach/code.php new file mode 100644 index 0000000..380ee69 --- /dev/null +++ b/tests/test_foreach/code.php @@ -0,0 +1,9 @@ +vars["foo"] = array( + "a" => array("a" => 100, "b" => 200), + "b" => array("a" => 1, "b" => 2), + "c" => array("a" => 42, "b" => 1337) + ); +} diff --git a/tests/test_foreach/test.tpl b/tests/test_foreach/test.tpl new file mode 100644 index 0000000..1aec8b4 --- /dev/null +++ b/tests/test_foreach/test.tpl @@ -0,0 +1,8 @@ +