2009-11-11 82 views
1

我有一个if函数可以计算出用户配置文件的完成程度,但我在下面包含的方式是我能想到的最好的方式,但它看起来效率很低。PHP If/Else - 更有效的方法来做到这一点?

有什么更好的方法来做到这一点?

if($user['first_name']!==""&&$user['last_name']!==""&&$user['pemail']!==""&&$user['dob']!==""&&$user['ambitions']!==""&&$user['memories']!==""&&$user['thoughts']!==""&&$user['message_1']!=="0"&&$user['message_2']!=="0"&&$user['message_3']!=="0"&&$user['v1']!=="0"&&$user['v2']!=="0"&&$user['v3']!=="0"&&$user['v4']!=="0"&&$user['v5']!=="0"&&$user['v6']!=="0"&&$user['v7']!=="0"&&$user['v8']!=="0"&&$user['v9']!=="0"&&$user['image_1']!==""&&$user['image_2']!==""&&$user['image_3']!=="") { 
    $completed = 4; 
} elseif($user['first_name']!==""&&$user['last_name']!==""&&$user['pemail']!==""&&$user['dob']!==""&&$user['ambitions']!==""&&$user['memories']!==""&&$user['thoughts']!==""&&$user['v1']!=="0"&&$user['v2']!=="0"&&$user['v3']!=="0"&&$user['v4']!=="0"&&$user['v5']!=="0"&&$user['v6']!=="0"&&$user['v7']!=="0"&&$user['v8']!=="0"&&$user['v9']!=="0"&&$user['image_1']!==""&&$user['image_2']!==""&&$user['image_3']!=="") { 
    $completed = 3; 
} elseif($user['first_name']!==""&&$user['last_name']!==""&&$user['pemail']!==""&&$user['dob']!==""&&$user['ambitions']!==""&&$user['memories']!==""&&$user['thoughts']!==""&&$user['message_1']!=="0"&&$user['message_2']!=="0"&&$user['message_3']!=="0"&&$user['image_1']!==""&&$user['image_2']!==""&&$user['image_3']!=="") { 
    $completed = 2; 
} elseif($user['first_name']!==""&&$user['last_name']!==""&&$user['pemail']!==""&&$user['dob']!==""&&$user['ambitions']!==""&&$user['memories']!==""&&$user['thoughts']!==""&&$user['image_1']!==""&&$user['image_2']!==""&&$user['image_3']!=="") { 
    $completed = 1; 
} else { 
    $completed = 0; 
} 

回答

2
function allset($arr, $names) { 
    foreach ($names as $name) 
     if ($arr[$name]=='') 
      return FALSE; 
    return TRUE; 
} 

$completed= 0; 
if (allset($user, array('first_name', 'last_name', 'pemail', 'dob', 'ambitions', 'memories', 'thoughts', 'image_1', 'image_2', 'image_3'))) { 
    $completed+= 1; 
    if (allset($user, array('message_1', 'message_2', 'message_3'))) 
     $completed+= 1; 
    if (allset($user, array('v1', 'v2', 'v3', 'v4', 'v5', 'v6', 'v7', 'v8', 'v9'))) 
     $completed+= 2; 
} 
0

您可能会为每个字段分配一个基准值,然后只需运行一个查询来检查非空字段的总数。

11

......怎么

$total = count($user); 
$missing = 0; 
foreach ($user as $item) 
{ 
    if (empty($item)) 
     $missing++; 
} 

// work out a percentage complete. 
$percentcomplete = intval((($total-$missing)/$total)*100); 
+3

建议:如何使用'empty($ item)'而不是'$ item ==''|| $ item =='0''? – brianreavis 2009-11-11 13:11:43

+0

不知道空着。什么是有用的东西:-)我已经更新了上面的代码来使用它。 – 2009-11-11 13:19:29

+1

这段代码确实假设$ user中至少有一个项目,并且它是一个数组。你可以添加你自己的支票... – 2009-11-11 13:20:33

2

通过$user并为每个值的所有值只是循环将其添加到总成绩。您可以定义哪些字段给出了在循环中查找得分的数组中的得分。

4

这可能做到这一点:

$percentComplete = count(array_filter($user))/count($user); 
0

如何对这样的事情 - 它似乎更长的时间,但它确实让你改变在一个更易于管理的方式对于每个级别的值

$l1 = array(
    'first_name','last_name','pemail','dob','ambitions', 
    'memories','thoughts','image_1','image_2','image_3' 
); 
$l2 = array_merge(
    array(
     'message_1','message_2','message_3', 
    ) 
    ,$l1); 
$l3 = array_merge(
    array(
     'v1','v2','v3','v4','v5','v6','v7','v8','v9'    
    ), 
    $l1 
); 
$l4 = array_unique(array_merge($l2,$l3)); 

$completed = 4; 
for ($i = 4; $i > 0 $i--) { 
    $arr = 'l'.$i; 
    foreach ($$arr as $key) { 
     if ($user[$key] == '' || $user[$key] == '0') { 
      $completed--; 
      break; 
     } 
    } 
    if ($i == $completed) { 
     break; 
    } 
} 
相关问题