首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环通过一个if语句?

循环通过一个if语句?
EN

Stack Overflow用户
提问于 2018-10-07 21:38:31
回答 2查看 55关注 0票数 0

我根据用户注册的天数来创建用户级别。通过这种方式,我想要创建诸如“在这个网站上一周年快乐”之类的信息。

到目前为止,我使用的代码如下所示。

代码语言:javascript
复制
// 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天)。

虽然这样做有效,但我正在寻找一种更高效/更干净的方法来编写这样的代码(比如在循环中):

代码语言:javascript
复制
$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。所以这段代码读为

代码语言:javascript
复制
if( $interval_obj->days >= 9125 && $interval_obj->days <= 9490 ) { 
    $output = 'level-25';
} else {
    $output = '0';
}

结果是0,因为用户只注册50天。

有没有更好的方法(有效)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-08 01:21:30

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

我测试了这个代码片段:

代码语言:javascript
复制
<?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";
}

它产生了这样的结果:

代码语言:javascript
复制
0
level-2
0
0

我想这就是你想要的。

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

票数 0
EN

Stack Overflow用户

发布于 2018-10-08 04:33:16

我建议创建一个算法,而不是一个具有硬编码级别的循环。例如,假设用户级别以30天的固定速率递增,下面的简单算法将准确和无限期地生成用户级别。

代码语言:javascript
复制
function calculateLevel($days){        
    $level = ceil(($days + .1) / 30) ?: 1;

    return "level-{$level}";
}

第30天是2级,60级是3级,等等.

代码语言:javascript
复制
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天增加一次,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52693145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档