Beispiel #1
0
 /**
  * 执行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;
 }