我可以在没有JSON的情况下获得JSON_NUMERIC_CHECK的效果吗?

时间:2017-01-13 12:18:36

标签: php

我可以在没有JSON的情况下获得JSON_NUMERIC_CHECK的效果吗?

即。将数字字符串重新替换为整数或浮点数。

JSON_NUMERIC_CHECK的示例:

<?php

// some input from somewhre
$data = explode(',', 'abc,7,3.14');

echo "Before:"; var_dump($data);

$data = json_decode(json_encode($data,  JSON_NUMERIC_CHECK), TRUE);

echo "After:"; var_dump($data);

但是我转换为json并且返回的速度很慢,还有其他方法可以获得相同的结果吗?

2 个答案:

答案 0 :(得分:1)

您可以循环使用string并使用以下代码将任何数值投射到intfloat

/**
 * Normalize an object, array or string by casting all 
 * numeric strings it contains to numeric values.
 * 
 * @param  array|object|string $data
 * @return mixed
 */
function normalize($data) {
    if (is_array($data))
        return array_map('normalize', $data);
    if (is_object($data))
        return (object) normalize(get_object_vars($data));
    return is_numeric($data) ? $data + 0 : $data;
}

$data = "15,2.35,foo";

$data = normalize(explode(',', $data));
// => [15, 2.35, 'foo']

希望这会有所帮助:)

更有效的方式

/**
 * Normalize an string or object by casting all 
 * numeric strings it contains to numeric values.
 * Note that it changes the variable directly 
 * instead of returning a copy.
 * 
 * @param  object|string $data
 * @return void
 */
function normalizeItem(&$data) {
    if (is_object($data)) {
        $data = get_object_vars($data);
        normalize($data);
        $data = (object) $data;
    } else {
        $data = is_numeric($data) ? $data + 0 : $data;
    }
}

/**
 * Applies normalizeItem to an array recursively.
 * 
 * @param  array &$list
 * @return bool
 */
function normalize(&$list) {
    return array_walk_recursive($list, 'normalizeItem');
}

答案 1 :(得分:0)

您可以使用array_map()进行回调。

$data = explode(',', 'abc,7,3.14');
$re = array_map(function(&$a) {
   return ctype_digit($a) ? intval($a) : $a;
}, $data);
var_dump($re);

https://eval.in/715641