PHP If / Else - более эффективный способ сделать это? - PullRequest
1 голос
/ 11 ноября 2009

У меня есть функция if, которая определяет, сколько профилей пользователей заполнено, однако то, что я включил ниже, было лучшим, о чем я мог подумать, однако оно кажется действительно неэффективным.

Какой лучший способ сделать это?

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;
}

Ответы [ 6 ]

11 голосов
/ 11 ноября 2009

Как насчет ...

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

// work out a percentage complete.
$percentcomplete = intval((($total-$missing)/$total)*100);
4 голосов
/ 11 ноября 2009

Это может сделать это:

$percentComplete = count(array_filter($user)) / count($user);
2 голосов
/ 11 ноября 2009
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;
}
2 голосов
/ 11 ноября 2009

Просто переберите все значения в $user и для каждого значения добавьте его к общему счету. Вы можете определить, какие поля дают какой счет в массивах, в которых вы просматриваете счет в цикле.

0 голосов
/ 11 ноября 2009

как на счет этого - кажется длиннее, но оно позволяет вам изменять значения для каждого из уровней более управляемым способом

$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;
    } 
}
0 голосов
/ 11 ноября 2009

Вы можете назначить базовое значение каждому полю, а затем просто выполнить запрос, проверяя итоговое значение для непустых полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...