/** * 获取输入参数 支持过滤和默认值 * 使用方法: * <code> * I('id',0); 获取id参数 自动判断get或者post * I('post.name','','htmlspecialchars'); 获取$_POST['name'] * I('get.'); 获取$_GET * </code> * @param string $name 变量的名称 支持指定类型 * @param mixed $default 不存在的时候默认值 * @param mixed $filter 参数过滤方法 * @param mixed $datas 要获取的额外数据源 * @return mixed */ function I($name, $default = '', $filter = null, $datas = null) { if (strpos($name, '/')) { // 指定修饰符 list($name, $type) = explode('/', $name, 2); } if (strpos($name, '.')) { // 指定参数来源 list($method, $name) = explode('.', $name, 2); } else { // 默认为自动判断 $method = 'param'; } switch (strtolower($method)) { case 'get': $input =& $_GET; break; case 'post': $input =& $_POST; break; case 'put': parse_str(file_get_contents('php://input'), $input); break; case 'param': switch ($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': parse_str(file_get_contents('php://input'), $input); break; default: $input = $_GET; } break; case 'path': $input = array(); if (!empty($_SERVER['PATH_INFO'])) { $depr = C('URL_PATHINFO_DEPR'); $input = explode($depr, trim($_SERVER['PATH_INFO'], $depr)); } break; case 'request': $input =& $_REQUEST; break; case 'session': $input =& $_SESSION; break; case 'cookie': $input =& $_COOKIE; break; case 'server': $input =& $_SERVER; break; case 'globals': $input =& $GLOBALS; break; case 'data': $input =& $datas; break; default: return null; } if ('' == $name) { // 获取全部变量 $data = $input; $filters = isset($filter) ? $filter : C('DEFAULT_FILTER'); if ($filters) { if (is_string($filters)) { $filters = explode(',', $filters); } foreach ($filters as $filter) { $data = arrayMapRecursive($filter, $data); // 参数过滤 } } } elseif (isset($input[$name])) { // 取值操作 $data = $input[$name]; $filters = isset($filter) ? $filter : C('DEFAULT_FILTER'); if ($filters) { if (is_string($filters)) { $filters = explode(',', $filters); } elseif (is_int($filters)) { $filters = array($filters); } foreach ($filters as $filter) { if (function_exists($filter)) { $data = is_array($data) ? arrayMapRecursive($filter, $data) : $filter($data); // 参数过滤 } elseif (0 === strpos($filter, '/')) { // 支持正则验证 if (1 !== preg_match($filter, (string) $data)) { return isset($default) ? $default : null; } } else { $data = filter_var($data, is_int($filter) ? $filter : filter_id($filter)); if (false === $data) { return isset($default) ? $default : null; } } } } if (!empty($type)) { switch (strtolower($type)) { case 's': // 字符串 $data = (string) $data; break; case 'a': // 数组 $data = (array) $data; break; case 'd': // 数字 $data = (int) $data; break; case 'f': // 浮点 $data = (double) $data; break; case 'b': // 布尔 $data = (bool) $data; break; } } } else { // 变量默认值 $data = isset($default) ? $default : null; } is_array($data) && array_walk_recursive($data, 'think_filter'); return $data; }
function arrayMapRecursive($filter, $data) { $result = array(); foreach ($data as $key => $val) { $result[$key] = is_array($val) ? arrayMapRecursive($filter, $val) : call_user_func($filter, $val); } return $result; }