对这些嵌套的if / elseif语句有什么更优雅的解决方案?

时间:2010-09-28 15:44:52

标签: php string user-input helper

我正在构建一个包含用户个人资料的用户的网站。配置文件中的许多字段都是可选的。

有很多用户生成内容的机会,因此我需要在网站的许多不同位置(评论,帖子等)显示此内容的作者。在用户的个人资料中,他能够(可选地)填写他的“名字”,他的“姓氏”和“显示名称”。

为了显示作者,我编写了一个帮助器方法,该方法查看这些字段的提供数组,并按优先顺序返回用户最合适的名称:

  1. 如果用户填写display_name,则会显示此信息。
  2. 如果用户填写了first_namelast_name,但没有填写display_name,则会显示两个名称
  3. 如果用户仅填写first_name,则会显示first_name
  4. 如果用户仅填写last_name,则会显示last_name
  5. 如果所有其他方法都失败,则会显示用户ID,即user123
  6. 如果没有数组键,或者参数为NULL,则名称将显示为NULL
  7. 这种方法效果很好,但很难看。必须有一种方法可以通过替代嵌套的if / else语句来美化它。

    public function nameify($names = NULL) {
        $name = '';
        if (!empty($names)) {
            if (!empty($names['display_name'])) {
                $name = $names['display_name'];
            } elseif (!empty($names['first_name'])) {
                $name = $names['first_name'];
                if (!empty($names['last_name'])) {
                    $name .= ' ' . $names['last_name'];
                }
            } elseif (!empty($names['last_name'])) {
                $name = $names['last_name'];
            }
    
            if (empty($name) && !empty($names['id'])) {
                $name = 'user' . $names['id'];
            } else {
                $name = 'NULL';
            }
        } else {
            $name = 'NULL';
        }
        return $name;
    }
    

9 个答案:

答案 0 :(得分:7)

public function nameify($names = NULL) {
    if ($names) {
        if (!empty($names['display_name'])) {
            return $names['display_name'];
        }
        if (!empty($names['first_name'])) {
            $name = $names['first_name'];
        } 
        if (!empty($names['last_name'])) {
            $name .= ' ' . $names['last_name'];
        }
        if (empty($name) && !empty($names['id'])) {
            $name = 'user' . $names['id'];
        }
    }
    return $name ? ltrim($name) : 'NULL';
}

首先设置默认值,如果没有其他匹配则返回。然后,因为我们总是想要返回显示名称,如果我们这样做的话。

编辑:调整以防止返回“NULL”

答案 1 :(得分:2)

使用三元条件,我们可以缩短和美化代码:

public function nameify($names = NULL) {
    $name = 'NULL';

    if (!empty($names)) {

        $name = ($names['display_name']) ? $names['display_name'] : trim($names['first_name']." ".$names['last_name']);

        if(!$name) $name = ($names['id'] > 0) ? 'user'.$names['id'] : 'NULL';
    }

    return $name;
}

答案 2 :(得分:1)

我建议这样做:

public function nameify($names = null) {
    if(empty($names))
        return null;

    if(!empty($names['display_name']))
        return $names['display_name'];

    if(!empty($names['first_name'])) {
        $name = $names['first_name'];
        if (!empty($names['last_name'])) {
            $name .= ' ' . $names['last_name'];
        }
        return $name;
    }

    if(!empty($names['id]))
        return 'user' . $names['id'];

    return null;
}

答案 3 :(得分:0)

它并不多,但因为$ name它至少是NULL:

public function nameify($names = NULL) {
    $name = 'NULL';
    if (!empty($names)) {
        if (!empty($names['display_name'])) {
            $name = $names['display_name'];
        } elseif (!empty($names['first_name'])) {
            $name = $names['first_name'];
            if (!empty($names['last_name'])) {
                $name .= ' ' . $names['last_name'];
            }
        } elseif (!empty($names['last_name'])) {
            $name = $names['last_name'];
        }

        if ($name=='NULL' && !empty($names['id'])) {
            $name = 'user' . $names['id'];
        } 
    } 
    return $name;
}

答案 4 :(得分:0)

我会选择:

if( empty($names['display_name']) ) {
    $name = $names['first_name'] . ' ' $names['last_name'];
else
    $name = $names['display_name'];

$name = trim($name);
if( empty($name) ) 
    $name = 'user'.$names['id'];
if( empty($name) ) 
    $name = 'NULL';

这将是'核心逻辑'......需要进行其他检查,例如$names != NULL或其他......

答案 5 :(得分:0)

//pointers to functions
$arrayOfSulutions{"display_name_strategy", "full_name_strategy" ..., "null_strategy" } 
function display_name_strategy{
     return $names['display_name'];
}
$i = 0;
while($res == null){
     $res = call($arrayOfSulutions[$i++]);
}

答案 6 :(得分:0)

可读性稍差但有效):

list($idx,$name) = array_shift(array_filter(array(
    $names['display_name'],
    implode(' ',array_filter(array($names['first_name'],$names['last_name']))),
    'user'.$names['id'];
    )));

答案 7 :(得分:0)

State machine非常适合这样的逻辑。实现起来也非常简单(使用switch语句)。

答案 8 :(得分:0)

我不确定我的版本会更简单,但现在是:

public function nameify($names = null) {
    $result = array();

    if( !empty($names['display_name']) ) {
        array_push($result,$names['display_name']);
    } else {
        if( !empty($names['first_name']) ) {
            array_push($result, $names['first_name']);
        }
        if( !empty($names['last_name']) ) {
            array_push($result, $names['last_name']);
        }
    }

    if( empty($result) && !empty($names['id']) ) {
        array_push($result, 'user'.$names['id']);
    }

    return (empty($result) ? 'NULL' : implode(' ', $result));
}