如何同时定位键和值以替换数组中的字符
How to target both key and value to replace characters in an array
我正在尝试以关联数组中的键和值为目标来删除双引号字符串。我正在通过 JSON.stringify 向 php 控制器传递一个字符串,如下所示:
"searchFilterType":"inside","searchFilterField":"okay","searchFilterGeoDistance":"27","searchFilterZip":"2","keyword":"test"
我将其分配给变量 $string;
我使用以下方法将其分解成一个数组:
$sExplode = explode(',', $string);
$searchFilters = [];
这给了我
[0] => "searchFilterType":"inside"
[1] => "searchFilterField":"okay"
[2] => "searchFilterGeoDistance":"25"
[3] => "searchFilterZip":""
[4] => "keyword":"test"
然后我使用这个将它分解成一个关联数组:
foreach ($sExplode as $v) {
$v = explode(":",$v);
$searchFilters[$v[0]] = $v[1];
}
这给了我:
["searchFilterType"] => "inside"
["searchFilterField"] => "okay"
["searchFilterGeoDistance"] => "27"
["searchFilterZip"] => "2"
["keyword"] => "test"
然后我使用以下方法从值中删除字符串:
$searchFilters = preg_replace("/[^a-zA-Z 0-9]+/", "", $searchFilters);
给我:
["searchFilterType"] => inside
["searchFilterField"] => okay
["searchFilterGeoDistance"] => 27
["searchFilterZip"] => 2
["keyword"] => test
但我仍然需要删除数组键中的字符串。我要达到的主要目标是最终结果:
[searchFilterType] => inside
[searchFilterField] => okay
[searchFilterGeoDistance] => 27
[searchFilterZip] => 2
[keyword] => test
有没有比这多个步骤更简单的解决方案?
如果您不想沿着 JSON 路线走下去,这只是以相同的方式执行 explode()
然后遍历结果数组并像处理分隔符一样处理它字符串(使用 str_getcsv()
)以 :
作为分隔符并允许它删除引号。
最后使用array_column()
将键和值组合成一个关联数组...
$string = '"searchFilterType":"inside","searchFilterField":"okay","searchFilterGeoDistance":"27","searchFilterZip":"2","keyword":"test"';
$sExplode = explode(',', $string);
$map = array_map(function ( $value ) { return str_getcsv($value, ":", '"'); }, $sExplode);
$out = array_column($map, 1, 0);
print_r($out);
给..
Array
(
[searchFilterType] => inside
[searchFilterField] => okay
[searchFilterGeoDistance] => 27
[searchFilterZip] => 2
[keyword] => test
)
如果 $string
是 JSON,最简单的做法是使用 json_decode
。
$result = json_decode($string, true);
如果 $string
是一个 JSON 片段,就像您在问题中显示的那样,最简单的做法可能仍然是 json_decode
。您只需添加括号即可完成解码。
$data = json_decode('{'.$string.'}', true);
我正在尝试以关联数组中的键和值为目标来删除双引号字符串。我正在通过 JSON.stringify 向 php 控制器传递一个字符串,如下所示:
"searchFilterType":"inside","searchFilterField":"okay","searchFilterGeoDistance":"27","searchFilterZip":"2","keyword":"test"
我将其分配给变量 $string;
我使用以下方法将其分解成一个数组:
$sExplode = explode(',', $string);
$searchFilters = [];
这给了我
[0] => "searchFilterType":"inside"
[1] => "searchFilterField":"okay"
[2] => "searchFilterGeoDistance":"25"
[3] => "searchFilterZip":""
[4] => "keyword":"test"
然后我使用这个将它分解成一个关联数组:
foreach ($sExplode as $v) {
$v = explode(":",$v);
$searchFilters[$v[0]] = $v[1];
}
这给了我:
["searchFilterType"] => "inside"
["searchFilterField"] => "okay"
["searchFilterGeoDistance"] => "27"
["searchFilterZip"] => "2"
["keyword"] => "test"
然后我使用以下方法从值中删除字符串:
$searchFilters = preg_replace("/[^a-zA-Z 0-9]+/", "", $searchFilters);
给我:
["searchFilterType"] => inside
["searchFilterField"] => okay
["searchFilterGeoDistance"] => 27
["searchFilterZip"] => 2
["keyword"] => test
但我仍然需要删除数组键中的字符串。我要达到的主要目标是最终结果:
[searchFilterType] => inside
[searchFilterField] => okay
[searchFilterGeoDistance] => 27
[searchFilterZip] => 2
[keyword] => test
有没有比这多个步骤更简单的解决方案?
如果您不想沿着 JSON 路线走下去,这只是以相同的方式执行 explode()
然后遍历结果数组并像处理分隔符一样处理它字符串(使用 str_getcsv()
)以 :
作为分隔符并允许它删除引号。
最后使用array_column()
将键和值组合成一个关联数组...
$string = '"searchFilterType":"inside","searchFilterField":"okay","searchFilterGeoDistance":"27","searchFilterZip":"2","keyword":"test"';
$sExplode = explode(',', $string);
$map = array_map(function ( $value ) { return str_getcsv($value, ":", '"'); }, $sExplode);
$out = array_column($map, 1, 0);
print_r($out);
给..
Array
(
[searchFilterType] => inside
[searchFilterField] => okay
[searchFilterGeoDistance] => 27
[searchFilterZip] => 2
[keyword] => test
)
如果 $string
是 JSON,最简单的做法是使用 json_decode
。
$result = json_decode($string, true);
如果 $string
是一个 JSON 片段,就像您在问题中显示的那样,最简单的做法可能仍然是 json_decode
。您只需添加括号即可完成解码。
$data = json_decode('{'.$string.'}', true);