问个简单的php编程逻辑判断问题

发布于 2022-09-06 06:12:15 字数 1972 浏览 11 评论 0

楼主遇到这样一个问题:
有10个人,分别是甲,乙,丙,丁,戊,己,庚,辛,壬,癸。
它们的优先级别是甲>乙>丙>丁>戊>己>庚>辛>壬>癸。
现在有这样一个需求。让这10个人中的其中一个人去做一件事情。
根据他们优先级别去选,
假设0=不在家,1=在家,若甲=1,就让甲去做,若甲=0;就让乙去做。若乙=1,就让乙去做,若甲=0;就让丙去做,以此类推。
若使用php处理这类问题,我以前的做法是一层一层的嵌套if判断,代码如下:

<?php
if ($a == 0) {
    /*不在家的时候让下一位去干*/
    if ($b == 0) {
        /*不在家的时候让下一位去干*/
        if ($c == 0) {
            /*不在家的时候让下一位去干*/
            if ($d == 0) {
                /*不在家的时候让下一位去干*/
                if ($e == 0) {

                    /*不在家的时候让下一位去干*/
                    if ($f == 0) {

                    /*不在家的时候让下一位去干*/
                        if ($g == 0) {

                    /*不在家的时候让下一位去干*/
                            if ($h == 0) {

                    /*不在家的时候让下一位去干*/
                                if ($j == 0)
                                           {

                    /*不在家的时候让下一位去干*/
                                    if ($k == 0) {

                    /*不在家的时候让下一位去干*/
                                    } else
                                           {
                          /*在家的时候干的事  */
                                    }
                                } else {

                          /*在家的时候干的事  */
                                }
                            } else {

                          /*在家的时候干的事  */
                            }
                        } else {

                          /*在家的时候干的事  */
                        }
                    } else {
                        /*在家的时候干的事  */
                    }
                } else {
                    /*在家的时候干的事  */
                }
            } else {
                /*在家的时候干的事  */
            }
        } else {
            /*在家的时候干的事  */
        }
    } else {
        /*在家的时候干的事  */
    }
} else {
    /*在家的时候干的事  */
}
?>

后来觉得这种做法过于死板。不灵活。请问各位大师更好更灵活的办法解决此类问题?
后来觉得这种做法过于死板。不灵活。请问各位大师更好更灵活的办法解决此类问题?
麻烦给我简单的例子。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

魔法少女 2022-09-13 06:12:15

此问题可以抽象一点,
可以利用 foreach表驱动法 来简化 if 判断。
示例代码如下:

<?php

/**
 * 假设:
 *  甲 => $a
 *  乙 => $b
 *  丙 => $c
 *  丁 => $d
 */
const JIA   = 0;
const YI    = 1;
const BING  = 2;
const DING  = 3;

/* 应该做什么事的方法映射表 */
$do_func_map = array(
    JIA     => function () { echo '甲去做一些事'; },
    YI      => function () { echo '乙去做一些事'; },
    BING    => function () { echo '丙去做一些事'; },
    DING    => function () { echo '丁去做一些事'; },
);

/* 各身份在家的情况 */
$conditon = array (
    JIA     => 0,
    YI      => 0,
    BING    => 1,
    DING    => 1
);

/* 去做事了 */
foreach ($conditon as $role => $role_cond) {
    if ($role_cond) {
        call_user_func($do_func_map[$role]);
        break;
    }
}

结果如下:

➜  answer git:(master) ✗ php run.php
丙去做一些事
我恋#小黄人 2022-09-13 06:12:15

采用配置文件,将你的策略写入配置文件,以二维数组为例:

$condition = [
    '1' => [
        'weight' => 10, // 这个策略的权重
        'deal_function' => 'jia',
        // other field
    ],
    '2' => [
        'weight' => 10,
        'deal_function' => 'yi',
        // other field
    ],
    '3' => [
        'weight' => 10,
        // other field
    ],
    '4' => [
        'weight' => 10,
        // other field
    ],
    '5' => [
        'weight' => 10,
        // other field
    ],
    // 

];

先对数据按照 weight 权重做排序,然后遍历
PHP为例

function sort_weight_desc($a, $b)
{
    return $a['weight']>$b['weight']? -1:1;
}

uasort($condition, "sort_weight_desc") //

function all_deal_function($value) {
    switch ($value['deal_function']) {
        case 'jia':
            # code...
            break;
        
        case 'yi':
            # code...
            break;
        
        
        default:
            # code...
            break;
    }
}


foreach($condition as $key => $value){
    all_deal_function($value);
    // do something
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文