对象属性转换为文本


object property to text

我正在从数据库中检索一个整数,该整数在输出时应对应于文本字符串。

$sql = ('SELECT drinking, smoking FROM users WHERE id = ?')
$q = $this->db->query($sql, $this->session->userdata('user_id'));
if ($q->num_rows() === 1) {
    $userobject = $q->row();
}

对于饮酒可能得到1,对于吸烟可能得到2。然后,我需要一个函数将该整数转换为相应的字符串。例如,"只在聚会上喝酒"用于喝酒,"我不吸烟"用于吸烟。

我希望只有一个函数可以处理所有的属性。

我正在考虑这样做:

$userobject->drinking = number_to_text($userobject->drinking);

然后有这样一个函数:

public function number_to_text()
{
}

但是由于这个函数将处理饮酒和吸烟(以及其他),那么我需要获得属性的名称以获得正确的字符串。

怎么做呢?

希望有人能帮助我(理解我)。如果不能这样做,我愿意建议用另一种方法来做。

提前致谢

根据你在评论中对这个问题的要求,我提出了我的建议,然而,经过重新思考,有一个更好的解决方案,你可以在下面找到。

首先,正如我的评论

您可以简单地将活动作为参数传递,例如将您的函数声明为

function number_to_text($value, $type_of_activity){
  switch ($type_of_activity){
    case 'drinking': 
      switch($value){
        case 1: return "I'm drinking a lot"; break;
        case 2: return "I've never tasted alcohol, I'm too young for that"; break;
        //
      } // switch($value)
      break;
    case 'smoking':
      switch($value){
        case 1: return 'I smoke as a steam engine'; break;
        case 2: return 'I saw once a smoke and since then I keep away from it'; break;
        //
      } // switch($value)
      break;
  } // switch $type_of_activity
  return ''unknown';
}

但是…

正如你所看到的,这是一个相当复杂的语句。

第二个,比较简单的

您可以创建一个包含所有文本的数组,例如:

$activities['drinking'][1] = "I'm drinking a lot";
$activities['drinking'][2] = "I've never tasted alcohol, I'm too young for that";
$activities['smoking'][1] = "I smoke as a steam engine";
$activities['smoking'][2] = "I saw once a smoke and since then I keep away from it";

,用

命名
$activity = 'drinking';
$userobject->{$activity} = $activities[$activity][$userobject->{$activity}];

使用Switch case并将您的case放入该函数中。看,我已经把它变成了一个数组响应,所以我们的属性将是一个键,值将是你想要的字符串。

public function number_to_text($text)
{
    switch($text) {
        case 1:
        $arr['property'] = 'drinking';
        $arr['val']      =  "Drinking at parties only";
        return $arr;
        break;

}