/** * 执行API的方法 */ public static function run($method, $param = false) { if (!$method) { return false; } $method = str_replace(".", "_", $method); $class = "API_Item_" . substr($method, 0, strrpos($method, "_")); $func = substr($method, strrpos($method, "_") + 1); self::$_nowMethod = $method; //通过私有云run调用 $data = call_user_func_array(array($class, $func), array($param)); #返回结果的处理 #格式如id,name,age *(id,name) id,row(tm,name) colorArr(*(name)) if ($data && is_array($data) && isset($param['rtnCols']) && $param['rtnCols']) { $level1Arr = array(); #第一维 $level2Arr = array(); #第二维 $level3Arr = array(); #第三维 #下面正则的作用:因为不过多维都是用逗号分割字段,id,row(tm(se,fr),name) 不好区分, #第三维用# 第二维用+ id,row(tm(se#fr)+name) $rtnCols = preg_replace_callback("#\\(.*\\(.*(,).*\\).*\\)#isU", create_function('$matches', 'return str_replace(",","#",$matches[0]);'), $param['rtnCols']); $rtnCols = preg_replace_callback("#\\(.*(,).*\\)#isU", create_function('$matches', 'return str_replace(",","+",$matches[0]);'), $rtnCols); $tmpArr = explode(",", $rtnCols); $l1Star = $l2Star = false; #第一维是否是* foreach ($tmpArr as $v) { $v = trim($v); if ($lp = strpos($v, '(')) { $v2 = substr($v, $lp + 1, -1); $v = substr($v, 0, $lp); $l1Star = $v == '*'; #第三维的处理 if ($lp2 = strpos($v2, '(')) { $v3 = substr($v2, $lp2 + 1, -1); $v2 = substr($v2, 0, $lp2); $l2Star = $v2 == '*'; $level3Arr[$v2] = explode("#", $v3); } $level2Arr[$v] = explode("+", $v2); } $level1Arr[] = $v; } $newData = array(); #对返回数据进行字段过滤处理 foreach ($data as $kk => $vv) { #符合第一维的限制 if ($l1Star || in_array($kk, $level1Arr)) { #如果是*,或是指定的key #如果第二维有限制 if ((isset($level2Arr[$kk]) || isset($level2Arr['*'])) && is_array($vv)) { $newVv = array(); foreach ($vv as $kk2 => $vv2) { #echo $kk; #print_r($level2Arr[$kk]); if (isset($level2Arr[$kk]) && (in_array($kk2, $level2Arr[$kk]) || in_array('*', $level2Arr[$kk])) || isset($level2Arr['*']) && in_array($kk2, $level2Arr['*'])) { #如果第三维有限制 如 color(*(name)) if ((isset($level3Arr[$kk2]) || isset($level3Arr['*'])) && is_array($vv2)) { $newVv2 = array(); foreach ($vv2 as $kk3 => $vv3) { if (isset($level3Arr[$kk2]) && in_array($kk3, $level3Arr[$kk2]) || isset($level3Arr['*']) && in_array($kk3, $level3Arr['*'])) { $newVv2[$kk3] = $vv3; } } $vv2 = $newVv2; } $newVv[$kk2] = $vv2; } } $vv = $newVv; } $newData[$kk] = $vv; } } $data = $newData; } //<<返回数据处理完毕 if (ZOL_API_UTF8 && $data) { $data = self::toUTF8($data); # array_walk_recursive($data, "api_json_convert_encoding_g2u"); return $data; } return $data; }