From f59a46a6dfe0194ba43092304029b2b843ed54bc Mon Sep 17 00:00:00 2001
From: Urban Müller
Date: Wed, 25 Jan 2017 16:05:28 +0100
Subject: optional keys selection in it::map

---
 it.class   | 12 ++++++++----
 tests/it.t |  7 ++++++-
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/it.class b/it.class
index a9b6662..1731330 100644
--- a/it.class
+++ b/it.class
@@ -950,18 +950,22 @@ static function date($format = "", $stamp = null)
  * Iterate over an array, replacing every element by function value or expression
  * @param $code The function or expression to apply. Expression may contain $k for keys and $v for values
  * @param $array The array to iterate over
+ * @param $p['keys'] Only modify elements with given keys (keys can be array or comma separated)
  */
-static function map($code, $array)
+static function map($code, $array, $p = null)
 {
 	static $cache = array();
 
+	if (is_string($code) && it::match('^[\w:]+$', $code))
+		$code .= '($v)';
+
 	if (!is_callable($func = $code) && !($func = $cache[$code]))
 		$func = $cache[$code] = create_function('$k,$v', "return $code;");
 
-	foreach ($array as $k => $v)
-		$result[$k] = $func($k, $v);
+	foreach ($p['keys'] ? it::filter_keys($array, $p['keys']) : $array as $k => $v)
+		$array[$k] = $func($k, $v);
 
-	return (array)$result;
+	return (array)$array;
 }
 
 /**
diff --git a/tests/it.t b/tests/it.t
index 1a4ccf9..c276d49 100755
--- a/tests/it.t
+++ b/tests/it.t
@@ -12,7 +12,6 @@ $oldlocale = setlocale(LC_CTYPE, 0);
 ini_set('default_charset', 'utf-8');
 setlocale(LC_CTYPE, 'de_CH');		# required becuase we're checking German umlauts in latin1 mode
 
-
 function match($regex, $string, $expect, $name, $p = array())
 {
 	$GLOBALS['TEST_MORE_LEVEL'] = 1;
@@ -418,3 +417,9 @@ is(it::mod(7, 4), 3);
 is(it::map('5*$k+$v', array(0 => 1, 1 => 2)), array(1, 7));
 is(it::map(create_function('$k,$v', 'return 5*$k+$v;'), array(0 => 1, 1 => 2)), array(1, 7));
 is(it::map(function($k, $v) {return 5*$k+$v;}, array(0 => 1, 1 => 2)), array(1, 7));
+is(it::map('strlen', array("aaa", "aa")), array(3, 2));
+is(it::map('it::ucfirst', array("aaa")), array("Aaa"));
+# Only map selected keys
+is(it::map('2*$v', [3, 4, 5], 'keys' => '0,1'), [6, 8, 5]);
+is(it::map('2*$v', [3, 4, 5], 'keys' => [0,1]), [6, 8, 5]);
+is(it::map('2*$v', ['foo' => 1, 'bar' => 2], 'keys' => 'foo'), ['foo' => 2, 'bar' =>2]);
-- 
cgit v1.2.3