我正在根据用户注册的天数创建用户级别。 这样,我想创建诸如“此网站上的一周年快乐”之类的消息。
到目前为止,我是使用以下代码构建的。
// 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;
不用说,这是行不通的。 $i
是25
(级别数),而不是1,2,3,4 ... 25。所以这段代码读为
if( $interval_obj->days >= 9125 && $interval_obj->days <= 9490 ) {
$output = 'level-25';
} else {
$output = '0';
}
结果为0
,因为该用户仅注册了50天。
是否有更好的方法(可行)?
答案 0 :(得分:0)
我认为您的主要问题是您的循环从0
到number 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天增加一次,依此类推。