diff options
-rw-r--r-- | it.class | 22 | ||||
-rwxr-xr-x | tests/it.t | 17 |
2 files changed, 33 insertions, 6 deletions
@@ -417,15 +417,25 @@ static function replace($replacements, $string, $p = array()) * Extract key => value pairs from assoc array by key * @param $array array to filter * @param $keys array or comma separated list of keys to keep + * @param $p['reorder'] reorder pairs to the order of the $keys array */ -static function filter_keys($array, $keys) +static function filter_keys($array, $keys, $p = array()) { $result = array(); - $keep = array_flip(is_string($keys) ? explode(",", $keys) : (array)$keys); - - foreach ($array as $key => $val) - if (isset($keep[$key])) - $result[$key] = $val; + if (is_string($keys)) + $keys = explode(",", $keys); + if ($p['reorder']) + { + foreach ((array)$keys as $key) + $result[$key] = $array[$key]; + } + else + { + $keep = array_flip((array)$keys); + foreach ($array as $key => $val) + if (isset($keep[$key])) + $result[$key] = $val; + } return $result; } @@ -199,4 +199,21 @@ is( array( array( 'word1', 'wörd2', 'word_3' ), array( '12', '3', '4' ) ), "test all=>1,pattern_order=>1" ); + + +# it::filter_keys tests + +$data = array('a' => 1, 'b' => 2, 'c' => 3); +is(it::filter_keys($data, 'a'), array('a' => 1), "select one key"); +is(it::filter_keys($data, array('a', 'b')), array('a' => 1, 'b' => 2), "select two keys with array"); +is(it::filter_keys($data, 'a,b'), array('a' => 1, 'b' => 2), "select two keys with string"); +is( + array_keys(it::filter_keys($data, 'b,a')), + array('a', 'b'), + "keep order of data array per default"); +is( + array_keys(it::filter_keys($data, 'b,a', array('reorder' => true))), + array('b', 'a'), + "reorder with given key order"); + ?> |