把数据字段类似状态的值快速转换成说明的函数

浏览:1234 发布日期:2016/04/26 分类:技术分享
大家都遇到过从数据库查询出来的数据时,包含一个表示状态的字段,姑且就叫 status吧.
而status的值分三种情况:1未开始, 2进行中, 3已结束,通常的做法是查询得到二维数据,然后遍历着把status转换成相应文本描述.
个人觉得,如果你喜欢优雅地写代码,那就有必要封装一个快速处理这一问题的函数....    
    /**
     * 表字段转文字说明
     * @param unknown $field 字段名
     * @param unknown $value 字据值
     * @param unknown $default 默认值
     * @return string 转换后的结果
     * 
     * $config = array(
     *    'addtime'=>array('callback', 'dateformat', array('Y-m-d', 'argA' '$3'=>'@total')),
     *    'endtime'=>array('callback', array($this, 'action'), array('$1'=>'fieldA', 'Y-m-d', '$3'=>'fieldB' )),
     * )

     */
    function toText($field, $config, $value, $default=''){
        
        $data = is_array($value)? $value : array($field => $value);
        if(is_array($value)) $value = $data[$field];

        if(empty($config[$field])) return $value;
        
        $config = $config[$field];
        if($config[0] == 'callback'){
            
            if(!isset($config[2])) $config[2] = array('$1'=>$field);
            
            $args = array();
            foreach($config[2] as $key => $arg){
                $args[] = is_numeric($key)? $arg : ($key === '@total'? $data : $data[$arg]);
            }
     
            $return = call_user_func_array($config[1], $args);
            
        }else{
            $return = isset($config[$value])? $config[$value] : $default;
        }
        return $return;
    
    }


     $config = array(
         'status'=>array(1=>'1未开始', 2=>'2进行中' 3=>'3已结束')
         'addtime'=>array('callback', 'date', array('Y-m-d', 'argA' '$3'=>'@total')),
         'endtime'=>array('callback', array($this, 'action'), array('$1'=>'fieldA', 'Y-m-d', '$3'=>'fieldB' )),
      );
    
    toText('status', $config, 2, '未知状态');
    //可以传一条数据数组
    $data = array('stauts'=>2, 'addtime'=>'100', 'fieldN'=>'abc');
    toText('status', $config, $data, '未知状态');
    
    //可以用函数/方法$config[2] 代表参数列表,参数依次排列,其中 '$1'这种字段名,表示会被转换成相应字段值.
    toText('addtime', $config, $data, '未知状态');
基于上述方法,我又加了一个方法,放在模型中


最终代查询代码大致如下:

结果:
最佳答案
评论( 相关
后面还有条评论,点击查看>>