为了账号安全,请及时绑定邮箱和手机立即绑定

大写数组键和小写数组值(从 parse_str 输入)

大写数组键和小写数组值(从 parse_str 输入)

PHP
蛊毒传说 2023-04-15 16:49:32
感觉这个问题已经解决了,但我的搜索没有找到“好的”解决方案。我有一个时间紧迫的应用程序,需要将典型的字符串转换为关联数组:"appliCAation=webCALL&Arg1=ABC&arG2=xyZ&someMore=Dec-1950"我知道我可以使用parse_str()它,但我想“规范化”用户输入,以便所有键始终大写,所有值始终小写(反之亦然,如果可能的话,通过参数完成并且不扩大代码的占用空间) .由于array_change_key_case()不递归工作,我寻找一种代码行少且性能高效的优雅方式。目前我使用parse_str( strtolower( $input ), $arr );然后循环(递归)数组来更改键。不幸的是,这需要两种方法和“许多”代码行。有没有更快/更好/更小的解决方案?
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

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


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);


查看完整回答
反对 回复 2023-04-15
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信