使用sprintf格式化字符串

3

我有这个字符串:

"[\"form\",\"form-elements\"], [\"company\",\"asdasd\"], [\"cod_postal\",\"051768\"], [\"recaptcha_challenge_field\",\"03AHJ_VuvJZjfMzRQolI_QhGijJqAEcRPswuz9l68I6VStJzTbuK4ilos06TIQKVsIy2vpe1PEq-Q5KBVlZ5xt4HM5VoJSWUgFTGVbtbmARtKiMvO4WZh57X0-QVDyQ5Lq-ZM8rMqB5O2-rCbnyw_UAGbbV1ZElsI4kuLk4ei6mzLtqgcU2VAR64tySiKPARDtahiTBKWePH2rjKO6KUBQTRE49TMjIGb5hg8sbYguKBSUrRF6G86b89M\"], [\"recaptcha_response_field\",\"168\"]"

这个字符串是使用以下代码从数组格式化而来:

function arrayDisplay($input)
{
    return implode(
        ', ',
        array_map(
            function ($v, $k) {
                return sprintf('["%s","%s"]', $k, $v);
            },
            $input,
            array_keys($input)
        )
    );
}

并使用以下方式进行编码:

$xml_array = arrayDisplay($_POST);
$xml_encode = json_encode($xml_array);

以下是$_POST变量中的数组:

array (size=5)
  'form' => string 'form-elements' (length=13)
  'company' => string 'asdasd' (length=6)
  'cod_postal' => string '051768' (length=6)
  'recaptcha_challenge_field' => string '03AHJ_VuvJZjfMzRQolI_QhGijJqAEcRPswuz9l68I6VStJzTbuK4ilos06TIQKVsIy2vpe1PEq-Q5KBVlZ5xt4HM5VoJSWUgFTGVbtbmARtKiMvO4WZh57X0-QVDyQ5Lq-ZM8rMqB5O2-rCbnyw_UAGbbV1ZElsI4kuLk4ei6mzLtqgcU2VAR64tySiKPARDtahiTBKWePH2rjKO6KUBQTRE49TMjIGb5hg8sbYguKBSUrRF6G86b89M' (length=249)
  'recaptcha_response_field' => string '168' (length=3)

首先,我想用[]包装整个字符串,将其中的""替换为[]:

[[\"form\",\"form-elements\"], [\"company\",\"asdasd\"], [\"cod_postal\",\"051768\"], [\"recaptcha_challenge_field\",\"03AHJ_VuvJZjfMzRQolI_QhGijJqAEcRPswuz9l68I6VStJzTbuK4ilos06TIQKVsIy2vpe1PEq-Q5KBVlZ5xt4HM5VoJSWUgFTGVbtbmARtKiMvO4WZh57X0-QVDyQ5Lq-ZM8rMqB5O2-rCbnyw_UAGbbV1ZElsI4kuLk4ei6mzLtqgcU2VAR64tySiKPARDtahiTBKWePH2rjKO6KUBQTRE49TMjIGb5hg8sbYguKBSUrRF6G86b89M\"], [\"recaptcha_response_field\",\"168\"]]

我该如何排除[\"form\",\"form-elements\"][\"recaptcha_challenge_field\",\"03AHJ_VuvJZjfMzRQolI_QhGijJqAEcRPswuz9l68I6VStJzTbuK4ilos06TIQKVsIy2vpe1PEq-Q5KBVlZ5xt4HM5VoJSWUgFTGVbtbmARtKiMvO4WZh57X0-QVDyQ5Lq-ZM8rMqB5O2-rCbnyw_UAGbbV1ZElsI4kuLk4ei6mzLtqgcU2VAR64tySiKPARDtahiTBKWePH2rjKO6KUBQTRE49TMjIGb5hg8sbYguKBSUrRF6G86b89M\"][\"recaptcha_response_field\",\"168\"]?使用什么工具,怎样操作?


你能具体说明你的目标吗?例如:我认为你试图实现的是删除键'form'、'recaptcha_challenge_field'和'recaptcha_response_field'的键值条目,以便它们不会出现在$_POST变量的键值映射中。我的假设正确吗? - klaar
3个回答

0
你必须过滤输入。过滤后,只需返回JSON编码的字符串:
function arrayDisplay($input)
{
    $input = array_filter($input, function ($key) {
        return !in_array($key, array('form', 'recaptcha_challenge_field', 'recaptcha_response_field'));
    }, ARRAY_FILTER_USE_KEY);

    return json_encode(array($input));
}

如果您仍然想要返回由逗号分隔的键值对,则保留原始的implode函数,并将结果与方括号连接起来:
function arrayDisplay($input)
{
    $input = array_filter($input, function ($key) {
        return !in_array($key, array('form', 'recaptcha_challenge_field', 'recaptcha_response_field'));
    }, ARRAY_FILTER_USE_KEY);

    return '[' . implode(
        ', ',
        array_map(
            function ($v, $k) {
                return sprintf('["%s","%s"]', $k, $v);
            },
            $input,
            array_keys($input)
        )
    ) . ']';
}

请注意,$xml_encode = json_encode($xml_array); 没有意义,因为返回的字符串几乎是一个有效的 JSON 编码字符串(在原始函数中)。如果这是您的意图,则必须使用我编写的第一个函数,并删除编码返回值的那行代码。

0

我做了一些更改,最终得到了这个:

 function arrayDisplay($input)
{
    $goodKeys = array_diff(array_keys($input), array('form', 'recaptcha_challenge_field', 'recaptcha_response_field'));
var_dump($goodKeys);

    $data = [];
    foreach ($goodKeys as $goodKey) {
       $data[$goodKey] = $input[$goodKey];
    }
    return '[' . implode(
        ', ',
        array_map(
            function ($v, $k) {
                return sprintf('["%s","%s"]', $k, $v);
            },
            $data,
            array_keys($data)
        )
    ) . ']';
}

但现在还有一个问题,我需要从字符串的开头/结尾中去掉这两个引号:“”。
"[[\"company\",\"123\"], [\"cod_postal\",\"051768\"]]"

转换为:

[[\"company\",\"123\"], [\"cod_postal\",\"051768\"]]

0
你应该从你的$_POST数组开始,并从中获取你真正需要的键:
$input = $_POST;
unset($input["form"]);
unset($input["recaptcha_challenge_field"]);
unset($input["recaptcha_response_field"]);

现在,$input数组看起来是这样的:

array(
  "company" => "asdasd",
  "cod_postal" => "051768"
);

接下来,我会更改你的arrayDisplay函数的定义,而不会改变其功能,将其分成两个部分:

function arrayPairs($input) {
    return array_map(
        function ($v, $k) {
            return [$k,$v];
        },
        $input,
        array_keys($input)
    );
}

function arrayDisplay($input) {
    return implode (", ", array_map('json_encode', arrayPairs($input)));
}

这个 arrayDisplay 函数仍然返回与以前相同的值,但现在您也可以调用 arrayPairs 而无需将其转换为字符串。相反,您可以使用 json_encode 进行转换,它会给出您想要的完全输出:

echo json_encode(arrayPairs($input));

这将输出:

[["公司","asdasd"],["邮政编码","051768"]]

注意: 如果你没有其他用途使用 arrayDisplay 函数, 那么可以舍去它. 这个解决方法只使用了函数 arrayPairs.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接