diff options
-rw-r--r-- | it.class | 9 | ||||
-rwxr-xr-x | tests/it.t | 12 |
2 files changed, 18 insertions, 3 deletions
@@ -950,15 +950,20 @@ 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) && is_callable($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 = is_array($array) ? $array : iterator_to_array($array); + foreach (isset($p['keys']) ? it::filter_keys($array, $p['keys']) : $array as $k => $v) $result[$k] = $func($k, $v); return (array)$result; @@ -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,14 @@ 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")); +is(it::map('$v->C14N()', DOMDocument::loadXML('<foo>42</foo>')->childNodes), [ '<foo>42</foo>' ], "Traversable: Needs copy, not modifiable in-place"); +# Special values which are not callable +is(it::map('null', array("aaa", "aa")), array(null, null)); +is(it::map('1', array("aaa", "aa")), array(1, 1)); +is(it::map(42, array("aaa", "aa")), array(42, 42)); +# 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]); |