遍历if语句?

时间:2018-10-07 21:38:32

标签: php loops if-statement

我正在根据用户注册的天数创建用户级别。 这样,我想创建诸如“此网站上的一周年快乐”之类的消息。

到目前为止,我是使用以下代码构建的。

// count days
$interval_obj->days;  // final variable counting the days a user has registered. e.g. 50 days

// array of number of levels. e.g. 25
$levels = apply_filters( 'hook_member_levels', array(       
    '1' => esc_html__('1 Level', $this->textdomain), 
    '2' => esc_html__('2 Levels', $this->textdomain),
    //...etc
) );

$one_min    = $option['level-1-min']; // e.g. 1 day
$one_max    = $option['level-1-max']; // e.g. 30 days
$two_min    = $option['level-2-min']; // e.g. 31 days
$two_max    = $option['level-2-max']; // e.g. 90 days
...etc.

if( $interval_obj->days >= $one_min && $interval_obj->days <= $one_max ) {             
    $output = 'level-1';
} elseif( $interval_obj->days >= $two_min && $interval_obj->days <= $two_max ) { 
    $output = 'level-2';
} elseif(){
    //... etc.
}

结果;当前用户将属于2级(50天)。

尽管这行得通,但我正在寻找一种更高效/更干净的方式对此进行编码(例如在循环内) 像这样:

$how_many_levels = count( $levels );    

for( $i = 0; $i <= $how_many_levels; $i++ ) {

    ${ $i .'_min' } = $option['level-'.$i.'-min'];
    ${ $i .'_max'} = $option['level-'.$i.'-max'];

    if( $interval_obj->days >= ${ $i .'_min' } && $interval_obj->days <= ${ $i .'_max' } ) { 
        $output = 'level-'.$i;
    } else {
        $output = '0';
    }

}

return $output;

不用说,这是行不通的。 $i25(级别数),而不是1,2,3,4 ... 25。所以这段代码读为

if( $interval_obj->days >= 9125 && $interval_obj->days <= 9490 ) { 
    $output = 'level-25';
} else {
    $output = '0';
}

结果为0,因为该用户仅注册了50天。

是否有更好的方法(可行)?

2 个答案:

答案 0 :(得分:0)

我认为您的主要问题是您的循环从0number of levels,但是没有级别0

我测试了这段代码片段:

<?php

$option['level-1-min'] = 1; 
$option['level-1-max'] = 30; 
$option['level-2-min']= 31; 
$option['level-2-max'] = 90; 
$option['level-3-min']= 91; 
$option['level-3-max'] = 120; 
$option['level-4-min']= 121; 
$option['level-4-max'] = 150; 

$days = 50;

for( $i = 1; $i <= 4; $i++ ) {

    ${ $i .'_min' } = $option['level-'.$i.'-min'];
    ${ $i .'_max'} = $option['level-'.$i.'-max'];

    if( $days >= ${ $i .'_min' } && $days <= ${ $i .'_max' } ) { 
        $output = 'level-'.$i;
    } else {
        $output = '0';
    }
    echo $output."\n";
}

它产生了以下输出:

0
level-2
0
0

我想这就是你想要的。

很显然,我对level数组和一些变量进行了硬编码,但是您应该提供所需的开始。

答案 1 :(得分:0)

我建议创建一种算法,而不要使用带有硬编码级别的循环。例如,假设用户级别以固定的30天增加,则下面的简单算法将准确且无限地生成用户级别。

function calculateLevel($days){        
    $level = ceil(($days + .1) / 30) ?: 1;

    return "level-{$level}";
}

在第30天,级别将为2,在级别3为60,依此类推...

0 --> level-1
1 --> level-1
29 --> level-1
30 --> level-2
31 --> level-2
59 --> level-2
60 --> level-3
61 --> level-3
89 --> level-3
90 --> level-4
91 --> level-4

如果水平增加的速率不固定,您仍然可以使用此方法来增加水平之间的差距。例如:90天后每45天增加一次水平,120天后每60天增加一次,依此类推。