Merge branch '2.x' into 3.x

* 2.x:
  simplified code
  fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator
This commit is contained in:
Fabien Potencier
2019-05-18 06:11:03 +02:00
4 changed files with 22 additions and 31 deletions
+1
View File
@@ -253,6 +253,7 @@
* 1.42.0 (2019-XX-XX)
* fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator (\SimpleXmlElement for instance)
* fixed a PHP fatal error when calling a macro imported in a block in a nested block
* fixed a PHP fatal error when calling a macro imported in the template in another macro
* fixed wrong error message on "import" and "from"
+3 -11
View File
@@ -1798,19 +1798,11 @@ function twig_array_column($array, $name): array
function twig_array_filter($array, $arrow)
{
if (\is_array($array)) {
if (\PHP_VERSION_ID >= 50600) {
return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);
foreach ($array as $k => $v) {
if ($arrow($v, $k)) {
yield $k => $v;
}
return array_filter($array, $arrow);
}
while ($array instanceof \IteratorAggregate) {
$array = $array->getIterator();
}
return new \CallbackFilterIterator($array, $arrow);
}
function twig_array_map($array, $arrow)
@@ -26,10 +26,20 @@
{% for k, v in ita|filter(v => v > offset) -%}
{{ k }} = {{ v }}
{% endfor %}
{% for k, v in xml|filter(x => true) %}
{{ k }}/{{ v }}
{% endfor %}
{# we can iterate more than once #}
{% for k, v in xml|filter(x => true) %}
{{ k }}/{{ v }}
{% endfor %}
--DATA--
return [
'it' => new \ArrayIterator(['a' => 1, 'b' => 2, 'c' => 5, 'd' => 8]),
'ita' => new IteratorAggregateStub(['a' => 1, 'b' => 2, 'c' => 5, 'd' => 8]),
'xml' => new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><doc><elem>foo</elem><elem>bar</elem><elem>baz</elem></doc>'),
]
--EXPECT--
1 = 5
@@ -50,3 +60,11 @@ d = 8
c = 5
d = 8
elem/foo
elem/bar
elem/baz
elem/foo
elem/bar
elem/baz
@@ -1,20 +0,0 @@
--TEST--
"filter" filter (PHP 5.6 required)
--CONDITION--
version_compare(phpversion(), '5.6.0', '>=')
--TEMPLATE--
{% set offset = 3 %}
{% for k, v in {a: 1, b: 2, c: 5, d: 8}|filter((v, k) => (v > offset) and (k != "d")) -%}
{{ k }} = {{ v }}
{% endfor %}
{% for k, v in it|filter((v, k) => (v > offset) and (k != "d")) -%}
{{ k }} = {{ v }}
{% endfor %}
--DATA--
return ['it' => new \ArrayIterator(['a' => 1, 'b' => 2, 'c' => 5, 'd' => 8])]
--EXPECT--
c = 5
c = 5