免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8604 | 回复: 20
打印 上一主题 下一主题

if elseif else太多怎么办 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-18 17:39 |只看该作者 |倒序浏览
写了一个函数,if elseif else太多,很不漂亮,有没有好的办法优化。
主要是判断$child,$mother,$father三个值,每个参数可能有四个值11,10,01,00
,第一个参数$child必需的,其它两个可选,计算每一种的组合,根据不同的组合,返回一个不同的$allele值。

如$child=00,$mother空值,$father空值,返回 "Unknown"
$child=11, $mother= 10, $father空值, 返回"Both (Homozygous)"


谢谢,新手只能写成这样难看的代码。





<?php
function getAllele($child,$mother = '',$father = '')
{
//only child data
    if(empty ($mother) && empty ($father)){
        if($child == '11'){
            $allele = 'Both (Homozygous)';
        }else{
            $allele = 'Unknown';
        }
        return $allele;

//child and mother data
    }elseif(!empty ($mother) && empty ($father)){
        if($child == "11"){
            $allele = 'Both (Homozygous)';
        }elseif ($child == '01' or $child == '10'){
            if($mother == '11'){
                $allele = 'Maternal (inferred)';
            }elseif ($mother == '00'){
                $allele = 'Paternal (inferred)';
            }else{
                $allele = 'Unknown';
            }
        }else{
            $allele = 'Unknown';
        }
        return $allele;

//child and father data
    }elseif(empty ($mother) && !empty ($father)){
        if($child == "11"){
            $allele = 'Both (Homozygous)';
        }elseif ($child == '01' or $child == '10'){
            if($father == '11'){
                $allele = 'Paternal (inferred)';
            }elseif ($father == '00'){
                $allele = 'Maternal (inferred)';
            }else{
                $allele = 'Unknown';
            }
        }else{
            $allele = 'Unknown';
        }
        return $allele;

//child and parents data
    }elseif(!empty ($mother) && !empty ($father)){
        if($child == "11"){
            $allele = 'Both (Homozygous)';
        }elseif ($child == '01' or $child == '10'){
            if($mother == '11'){
                if($father == '01' or $father = '10' or $father == '00'){
                    $allele = 'Maternal (confirmed)';
                }else{
                    $allele = 'Unknown';
                }
            }elseif($mother == '01' or $mother == '10'){
                if($father== "00"){
                    $allele = 'Maternal (confirmed)';
                }elseif($father=='11'){
                    $allele = 'Paternal (confirmed)';
                }else{
                    $allele = 'Unknown';
                }
            }elseif ($mother == '00'){
                if($father == '10' or $father == '01' or $father == '11'){
                    $allele = 'Paternal (confirmed)';
                }else{
                    $allele = 'Unknown';
                }
            }
        }else{
            $allele = 'Unknown';
        }
        return $allele;
    }
}

//end
?>

论坛徽章:
0
10 [报告]
发表于 2013-02-22 10:17 |只看该作者
逆向思维:
结果的状态集 相比于 if-else条件集小很多,可画一个状态机。
一个输出对应于有哪些条件集,条件集是否有合并的余地?

另:一个输出对应一组条件,针对这个输出写一个函数。如果有N个输出,就写N个函数。会清晰一些。

论坛徽章:
0
2 [报告]
发表于 2013-02-18 17:48 |只看该作者
本帖最后由 chlinux 于 2013-02-18 17:55 编辑

回复 1# feiyue0908


    可考虑把数据写到一个数组里。可多维
  1. array(
  2.         'child'=>array(11,10,01,00),
  3.         'mother'=>array(11,10,01,00),
  4.         'father'=>array(11,10,01,00),               
  5. )

  6. //然后
  7. foreach ($array as $key => $value) {
  8.     //
  9. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-02-18 18:38 |只看该作者
谢谢,我试试吧,对复杂程序还是比较迷茫的,查查资料看看


回复 2# chlinux


   

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
4 [报告]
发表于 2013-02-19 09:19 |只看该作者
switch/case

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2013-02-20 09:46 |只看该作者
bikong0411 发表于 2013-02-19 02:19
switch/case
谢谢,我试试查查资料看看

论坛徽章:
0
6 [报告]
发表于 2013-02-20 17:41 |只看该作者
能用表格驱动的不要用if else

论坛徽章:
0
7 [报告]
发表于 2013-02-20 20:41 |只看该作者
你说的表格驱动是什么样的?谢谢
回复 6# yyxxzz


   

论坛徽章:
0
8 [报告]
发表于 2013-02-21 10:35 |只看该作者
回复 7# feiyue0908


<代码大全2> 表格驱动 google 一下   

论坛徽章:
0
9 [报告]
发表于 2013-02-21 11:37 |只看该作者
switch           
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP