我正在构建一个包含用户个人资料的用户的网站。配置文件中的许多字段都是可选的。
有很多用户生成内容的机会,因此我需要在网站的许多不同位置(评论,帖子等)显示此内容的作者。在用户的个人资料中,他能够(可选地)填写他的“名字”,他的“姓氏”和“显示名称”。
为了显示作者,我编写了一个帮助器方法,该方法查看这些字段的提供数组,并按优先顺序返回用户最合适的名称:
display_name
,则会显示此信息。first_name
和last_name
,但没有填写display_name
,则会显示两个名称first_name
,则会显示first_name
。last_name
,则会显示last_name
。user123
NULL
这种方法效果很好,但很难看。必须有一种方法可以通过替代嵌套的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;
}
答案 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));
}