그 문제는 이미 해결 된 것 같지만 "좋은"해결책을 찾지 못했습니다. 시간이 중요한 앱이 있고 일반적인 문자열을 assoc 배열로 변환해야합니다.
"appliCAation=webCALL&Arg1=ABC&arG2=xyZ&someMore=Dec-1950"
나는 그것을 사용할 수 있다는 것을 알고 parse_str()
있지만 모든 키가 항상 대문자이고 모든 값이 항상 소문자가되도록 사용자 입력을 "정규화"하고 싶습니다 (가능한 경우 매개 변수에 의해 수행되고 코드의 풋 프린트를 넓 히지 않음). .
array_change_key_case()
는 재귀 적으로 작동하지 않기 때문에 몇 줄의 코드와 효율적인 성능으로 우아한 방법을 찾습니다.
현재 나는 parse_str( strtolower( $input ), $arr );
키를 변경하기 위해 배열을 사용 하고 (재귀 적으로) 반복합니다. 불행히도 두 가지 방법과 "많은"코드 라인이 필요합니다.
더 빠르고 / 더 좋고 / 작은 솔루션이 있습니까?
논리를 뒤집고 모든 것을 대문자로 만든 다음 값을 재귀 적으로 소문자로 지정합니다.
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);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다