diff --git a/CHANGELOG b/CHANGELOG index 7c2ffca86..bd21f9a0b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ * 2.7.5 (2019-XX-XX) - * n/a + * add "column" filter * 2.7.4 (2019-03-23) diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 09d48a774..09ae1bd81 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -226,6 +226,7 @@ final class CoreExtension extends AbstractExtension new TwigFilter('sort', 'twig_sort_filter'), new TwigFilter('merge', 'twig_array_merge'), new TwigFilter('batch', 'twig_array_batch'), + new TwigFilter('column', 'twig_array_column'), // string/array filters new TwigFilter('reverse', 'twig_reverse_filter', ['needs_environment' => true]), @@ -1684,4 +1685,32 @@ function twig_get_attribute(Environment $env, Source $source, $object, $item, ar return $ret; } + +/** + * Return the values from a single column in the input array. + * + *
+ *  {% set items = [{ 'fruit' : 'apple'}, {'fruit' : 'orange' }] %}
+ *
+ *  {% set fruits = items|column('fruit') %}
+ *
+ *  {# fruits now contains ['apple', 'orange'] #}
+ * 
+ * + * @param array|Traversable $arr An array + * @param mixed $column_key The column key + * + * @return array The array of values + */ +function twig_array_column($arr, $column_key) +{ + if ($arr instanceof Traversable) { + $arr = \iterator_to_array($arr); + } elseif (!\is_array($arr)) { + throw new RuntimeError(sprintf('The column filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($arr))); + } + + return \array_column($arr, $column_key); +} + } diff --git a/test/Twig/Tests/Fixtures/filters/column.test b/test/Twig/Tests/Fixtures/filters/column.test new file mode 100644 index 000000000..a2a7f2eb3 --- /dev/null +++ b/test/Twig/Tests/Fixtures/filters/column.test @@ -0,0 +1,11 @@ +--TEST-- +"column" filter +--TEMPLATE-- +{{ array|column('foo')|join }} +{{ traversable|column('foo')|join }} +--DATA-- +$items = array(array('bar' => 'foo', 'foo' => 'bar'), array('foo' => 'foo', 'bar' => 'bar')); +return array('array' => $items, 'traversable' => new ArrayIterator($items)); +--EXPECT-- +barfoo +barfoo