如何同时定位键和值以替换数组中的字符

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