【问题标题】:Uppercase array keys and Lowercase array values (input from parse_str)大写数组键和小写数组值(来自 parse_str 的输入)
【发布时间】:2020-05-23 17:38:22
【问题描述】:

感觉这个问题已经解决了,但我的搜索没有找到“好的”解决方案。我有一个时间要求严格的应用程序,需要将一个典型的字符串转换为一个关联数组:

"appliCAation=webCALL&Arg1=ABC&arG2=xyZ&someMore=Dec-1950"

我知道我可以为此使用parse_str(),但我想“规范化”用户输入,以便所有键始终为大写,所有值始终为小写(反之亦然,如果可能通过参数完成而不是加宽代码的足迹)。

由于array_change_key_case()不能递归工作,所以我寻找一种代码行少、性能高效的优雅方式。

目前我使用parse_str( strtolower( $input ), $arr );,然后循环(递归)数组来更改键。不幸的是,这需要两种方法和“许多”代码行。

有更快/更好/更小的解决方案吗?

【问题讨论】:

  • 一旦问题被分解(“首先解析”),很容易找到与每个任务相关的解决方案:array_change_key_casestackoverflow.com/q/25068571/2864740 等。
  • 哦,我明白了..有些上有些下..:|
  • 您两次recursively 提及,但没有显示需要递归的数组。

标签: php arrays


【解决方案1】:

翻转你的逻辑并将所有内容大写,然后递归小写值:

parse_str(strtoupper($string), $array);    
array_walk_recursive($array, function(&$v, $k) { $v = strtolower($v); });

这适用于多个维度,例如:

$string = "appliCAation=webCALL&Arg1=ABC&arG2=xyZ&someMore=Dec-1950&a[yZ][zzz]=efG";

产量:

Array
(
    [APPLICAATION] => webcall
    [ARG1] => abc
    [ARG2] => xyz
    [SOMEMORE] => dec-1950
    [A] => Array
        (
            [YZ] => Array
                (
                    [ZZZ] => efg
                )
        )
)

重读问题后,我发现您希望能够更改或控制键和值是大写还是小写。你可以use()一个参数数组作为函数名使用:

$params = ['key' => 'strtoupper', 'val' => 'strtolower'];
parse_str($params['key']($string), $array);    
array_walk_recursive($array, function(&$v, $k) use($params){ $v = $params['val']($v); });

要仅更改键,我会在原始字符串上使用正则表达式:

$keys = 'strtoupper';
$string = preg_replace_callback('/[^=&]*=/', function($m) use($keys) { return $keys($m[0]); }, $string);
parse_str($string, $array);

[^=&]*= 是一个字符类 [] 匹配 ^ 而不是 =& 0 次或多次 * 后跟 = 的字符。

最后,如果你提供了一个函数名(注意val 为空),这里将执行键和值,如果没有,则不进行转换:

$params = ['key' => 'strtoupper', 'val' => ''];
$string = preg_replace_callback('/([^=&]*)=([^=&]*)/',
                                function($m) use($params) {
                                    return (empty($params['key']) ? $m[1] : $params['key']($m[1]))
                                           .'='.
                                           (empty($params['val']) ? $m[2] : $params['val']($m[2]));
                                }, $string);
parse_str($string, $array);

【讨论】:

  • 最后一个问题......是否有可能将值“按原样”保持为“替代方案”?我知道第一步是将整个字符串更改为键的外观,然后使用 array_walk 来“更正”这些值。如果我不想更改值而只更改键怎么办?
  • 用正则表达式编辑。
  • NP,又加了一个 ;-)
  • 哇。谢谢。做得好。我需要更深入地处理/学习正则表达式!
猜你喜欢
  • 2021-09-03
  • 2015-08-13
  • 1970-01-01
  • 2021-07-29
  • 2012-03-08
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
相关资源
最近更新 更多