使用sprintf格式化字符串

时间:2016-02-01 13:05:32

标签: php printf

我有这个字符串:

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

我可以用它做什么以及如何做?

3 个答案:

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

答案 1 :(得分: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 函数的定义而不改变其功能,将其拆分为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 功能用于任何其他目的,那么您可以取消它。此解决方案仅使用函数 arrayPairs

答案 2 :(得分: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)
        )
    ) . ']';
}

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

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

到此:

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