使用 sprintf 设置字符串的格式


Format the string using sprintf

我有这个字符串:

"['"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'"]

我可以使用什么以及如何做到这一点?

您必须过滤输入。过滤后,您只需返回 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));
}

如果您仍然想返回以逗号分隔的键值对,请保留原始内爆函数并使用方括号连接结果:

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 编码字符串(在原始函数中)。如果这是您的意图,那么您必须使用我编写的第一个函数并删除再次编码返回值的那行代码。

你应该从 $_POST 数组开始,并从中获取你真正需要的密钥:

$input = $_POST;
unset($input["form"]);
unset($input["recaptcha_challenge_field"]);
unset($input["recaptcha_response_field"]);

现在$input数组如下所示:

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

然后,我将更改 arrayDisplay 函数的定义而不改变其功能,将其拆分为 2:

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"],["cod_postal","051768"]]

注意:如果您不将 arrayDisplay 函数用于任何其他目的,那么您可以取消它。此解决方案仅使用函数数组对

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

 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)
        )
    ) . ']';
}

但是现在还有一个问题,我需要从字符串的开头/结尾摆脱 " 这个 2:由此:

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

对此:

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