我根据用户注册的天数来创建用户级别。通过这种方式,我想要创建诸如“在这个网站上一周年快乐”之类的信息。
到目前为止,我使用的代码如下所示。
// 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天。
有没有更好的方法(有效)?
发布于 2018-10-08 01:21:30
我认为您的主要问题是循环从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我想这就是你想要的。
显然,我对级别数组和一些变量进行了硬编码,但是您应该提供所需的开始。
发布于 2018-10-08 04:33:16
我建议创建一个算法,而不是一个具有硬编码级别的循环。例如,假设用户级别以30天的固定速率递增,下面的简单算法将准确和无限期地生成用户级别。
function calculateLevel($days){
$level = ceil(($days + .1) / 30) ?: 1;
return "level-{$level}";
}第30天是2级,60级是3级,等等.
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天增加一次,等等。
https://stackoverflow.com/questions/52693145
复制相似问题