php入门第三天

    三元运算和if语句。

    我先道歉,我最近才发现我用的wamp不是我说的那一版,我安装wamp的时候没删老版的,而且安装在了原目录。现在发现新版的默认配置是如果变量未赋初值,就会报错。虽然变量未赋初值改配置文件就可以,这样写起来也方便,但据我的经验,这样做,好处比坏处少。

    现在在下面的二段代码中加入了这两句,就不会报错了。

isset($_POST['user_id']) ? '' : $_POST['user_id'] = '';

isset($_POST['user_name']) ? '' : $_POST['user_name'] = '';

    下面的例子有sql注入漏洞。另外,如果输入内容中含有双引号,也会破坏表单。

    这个是三元运算的例子,注意下面的html代码中有php代码。

<!-- ternary.php start -->

<?php

isset($_POST['user_id']) OR $_POST['user_id'] = FALSE;

isset($_POST['user_name']) OR $_POST['user_name'] = FALSE;


$sql_where = ($_POST['user_id'] != '' ? " and b='{$_POST['user_id']}'" : '') .

($_POST['user_name'] != '' ? " and b='${_POST['user_name']}'" : '');

?> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<meta name="generator" content="PSPad editor, www.pspad.com">

<title></title>

</head>

<body>

<form method="post" accept-charset="utf-8" > 

<?php echo ($sql_where !== '' ? ' where ' . substr($sql_where, 4) : ''); ?>

<br/>

<input type="text" name="user_id" id="user_id" value="" maxlength="100" size="50" style="width:50%" />

<input type="text" name="user_name" id="user_name" value="<?php echo $_POST['user_name']; ?>" maxlength="100" size="50" style="width:50%" />

<input type="submit" name="mysubmit" value="Submit Post!" />

</form>

</body>

</html>

<!-- ternary.php end -->

if语句要麻烦一些。

<!-- if.php start -->

<?php

$sql_where = '';

isset($_POST['user_id']) OR $_POST['user_id'] = FALSE;

isset($_POST['user_name']) OR $_POST['user_name'] = FALSE;


if ($_POST['user_id'] != '')

    $sql_where .= " and b='{$_POST['user_id']}'";

}

if ($_POST['user_name'] != '')

{

    $sql_where .= " and b='${_POST['user_name']}'";

}

?> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<meta name="generator" content="PSPad editor, www.pspad.com">

<title></title>

</head>

<body>

<form method="post" accept-charset="utf-8" > 

<?php if ($sql_where !== ''){ echo ' where ' . substr($sql_where, 4); } ?>

<br/>

<input type="text" name="user_id" id="user_id" value="" maxlength="100" size="50" style="width:50%" />

<input type="text" name="user_name" id="user_name" value="<?php echo $_POST['user_name']; ?>" maxlength="100" size="50" style="width:50%" />

<input type="submit" name="mysubmit" value="Submit Post!" />

</form>

</body>

</html>

<!-- if.php end -->

    但是,很多时候用ifswitch语句更好, 还可以用数组的键值代替(参见《代码大全》这本书)。而用三元运算符很多时候会让代码不合规范, 不易理解。(php5.4之前,三元运算符相比if语句,效率较低,5.4之后就差不多了,详见这篇博客 http://www.laruence.com/2011/11/04/2258.html

<?php

/* phpnet dot 20 dot dpnsubs at xoxy dot net (01-Nov-2007 10:13) */

$a = 2; 

echo ($a === 1 ? 'one' : 

   ($a === 2 ? 'two' : 

        ($a === 3 ? 'three' : 

           ($a === 4 ? 'four' : 'other'))));

echo '<br/>';

//很像lispif语句

/* ;lisp

(setq b 3)

(print (if (equal b 1)

 "one"

 (if (equal b 2)

   "two"

   (if (equal b 3)

     "three")))) */

$b = 3;

if ($b === 1)

{

   echo 'one';

}

elseif ($b === 2)

{

   echo 'two';

}

else if ($b === 3)

{

   echo 'three';

}

echo '<br/>';

$c = 1;

switch ($c)

{

case 1:

    echo 'one';

    break;

case 2:

    echo 'two';

    break;

}

echo '<br/>';

/* ;lisp

(setq c 2)

(cond ((equal c 1) (print "one"))

      ((equal c 2) (print "two"))

      ((equal c 3) (print "three")))

*/

$d = 3;

$e = '1';

$arr_num = array (

   1 => 'one',

   '2' => 'two',

   '3' => 'three',

   '11' => 'four',

   'nil'

);

echo $arr_num[$d] , '-' , $arr_num[$e] , '-' , $arr_num[12];

echo '<br/>';

//很明显,用数组,条件和方法更好分离。


/* ;lisp

(setf a 3)

(setf trans '((1 . "one") 

      (2 . "two")

      (3 . "three")

      (3 . "three2")))

  

(print (cdr (assoc 'a trans))) */

?>


基于数组对if语句的重构。

if时。

<?php

$table = 'test_order';

if ($table === 'test_order' OR

        $table === 'test_client' OR

        $table === 'test_area')

{

    echo $table;

}

else

{

    die('err');

}

?>

用数组代替多个OR时。

<?php

$table = 'test_order';

$arr = array(

    'test_order' => '',

    'test_area' => '',

    'test_client' => '',);

if (isset($arr[$table]))

{

    echo $table;

}

else

{

    die('err');

}

?>

很明显用数组代码更少,更重要的是,数据可以作为值来传递,而在php中,代码是不能作为数据结构来传递的。当然,有时候用数组会损失一点点效率,但不是系统瓶颈的话,是不值得去优化的——过早优化之所以不好,是因为很多时候优化 约等于 “写死”, 也就失去了灵活性。

基于switch和函数对if语句的重构。

<?php


$inkai_pattern = '3';

$dly_summary = 123;

$dly_sum_nyukai = 55;

$dly_nyu_keskin2 = 1;

$dly_nyu_keskin3 = 2;

$dly_nyu_keskin4 = 4;

$dly_nyu_keskin5 = 8;

$dly_nyu_keskin6 = 16;

$dly_dpe_urikin = 13;

$dly_bup_urikin = 14;


//重构前的代码——先辈的代码 变量都是些日语拼音,不过我们单位多数的表都是日语拼音命名的。

if ($inkai_pattern == "1")

{

    $dly_nyu_genkin = $dly_summary - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);

    $dly_tenant_kin = 0;

}

elseif ($inkai_pattern == "2")

{

    $dly_nyu_genkin = 0;

    $dly_tenant_kin = $dly_summary - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);

}

elseif ($inkai_pattern == "3")

{

    $dly_nyu_genkin = $dly_sum_nyukai + $dly_dpe_urikin + $dly_bup_urikin;

    $dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);

}

elseif ($inkai_pattern == "4")

{

    $dly_nyu_genkin = $dly_sum_nyukai + $dly_bup_urikin;

    $dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);

}

elseif ($inkai_pattern == "5")

{

    $dly_nyu_genkin = $dly_sum_nyukai;

    $dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);

}

elseif ($inkai_pattern == "6")

{

    $dly_nyu_genkin = $dly_sum_nyukai;

    $dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);

}

var_dump($dly_nyu_genkin, $dly_tenant_kin);

// 重构后的代码

list($dly_nyu_genkin, $dly_tenant_kin) = get_cash_deposit($inkai_pattern, array(

    'all_summary' => $dly_summary,

    'all_sum_nyukai' => $dly_sum_nyukai,

    'bup_urikin' => $dly_dpe_urikin,

    'dpe_urikin' => $dly_bup_urikin,

    'nyu_keskin2' => $dly_nyu_keskin2,

    'nyu_keskin3' => $dly_nyu_keskin3,

    'nyu_keskin4' => $dly_nyu_keskin4,

    'nyu_keskin5' => $dly_nyu_keskin5,

    'nyu_keskin6' => $dly_nyu_keskin6,

        ));

var_dump($dly_nyu_genkin, $dly_tenant_kin);

function get_cash_deposit($inkai_pattern, $data)

{

    //对未定义的值设定默认值如果必须有值,则不应设默认值。

    $data = array_merge(

        array(

            'bup_urikin' => 0,

            'dpe_urikin' => 0,

        ), $data

    );

    $data['_pattern'] = (int) $inkai_pattern;

    

    {// 很旧的项目配置register_globals = on ,不可以用extract,所以以后做新项目一定要把这个关了。实际上下面的写法很傻,可以用很简单的写法代替extract函数。

        /* $all_summary = $data['all_summary'];
        $all_sum_nyukai = $data['all_sum_nyukai'];
        $bup_urikin = $data['bup_urikin'];
        $dpe_urikin = $data['dpe_urikin'];
        $nyu_keskin2 = $data['nyu_keskin2'];
        $nyu_keskin3 = $data['nyu_keskin3'];
        $nyu_keskin4 = $data['nyu_keskin4'];
        $nyu_keskin5 = $data['nyu_keskin5'];
        $nyu_keskin6 = $data['nyu_keskin6'];
        $_pattern = $data['_pattern']; */
        

        //觉得自己傻了,实际上可以用一个循环代替extract

        foreach ($data as $key=>$val)

        {
            ${$key} = $val;
        }

    }

    

    

    $sum_nyu_keskin = $nyu_keskin2 + $nyu_keskin3 + $nyu_keskin4 + $nyu_keskin5 + $nyu_keskin6;

    $nik_data = 0;

    $tenant_kin = 0;

    switch ($_pattern)

    {

        case 1:

            $nik_data = $all_summary - $sum_nyu_keskin;

            $tenant_kin = 0;

            break;

        case 2:

            $nik_data = 0;

            $tenant_kin = $all_summary - $sum_nyu_keskin;

            break;

        case 3:

            $nik_data = $all_sum_nyukai + $bup_urikin + $dpe_urikin;

            $_pattern = 101;

            continue;

        case 4:

            $nik_data = $all_sum_nyukai + $bup_urikin;

            $_pattern = 101;

            continue;

        case 5:

        case 6:

            $nik_data = $all_sum_nyukai;

            $_pattern = 101;

            continue;

        case 101:

            $tenant_kin = $all_sum_nyukai - $nik_data - $sum_nyu_keskin;

            break;

    }

    

    return array($nik_data, $tenant_kin);

}

?>

    很明显用数组代码更少,更重要的是,数据可以作为值来传递,而在php中,代码是不能作为数据结构来传递的。当然,有时候用数组会损失一点点效率,但不是系统瓶颈的话,是不值得去优化的——有时候优化之所以不好,是因为很多时候优化 约等于 “写死”, 也就失去了灵活性。


    php手册中switch这一章讲了很多细节,大家可以看下。

    由于这一章代码多一些,希望刚刚学编程的人就不要用记事本了。建议用nopepad++PSPad做文本编辑器,然后从易到难,再学习vi。IDE会有一些很有用的提示(偶尔会打扰思路,但对初学者非常有用),个人推荐NetBeans这个集成环境做开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。不过在开始之前,我想提醒你一点:我是一个人工智能程序,虽然我能够回答你的问题,但我没有自己的思想和判断力,我的回答仅仅是基于预先编写好的算法和数据模型,所以我的回答可能存在局限性和偏差,仅供参考。 那么,回到你的问题。你问的是如何实现PHP扑克牌比大小,这是一个比较经典的问题,需要用到一些基本的编程知识和算法。 首先,我们需要了解扑克牌的规则。扑克牌一共有52张,分为四种花色(红桃、方块、梅花、黑桃),每种花色有13张牌(A、2、3、4、5、6、7、8、9、10、J、Q、K)。比大小的时候,先比较牌型(顺子、同花、葫芦等),如果牌型相同,则按照牌面大小比较,A最大,2最小,依次递增。 接着,我们可以考虑如何用PHP来实现扑克牌的比较。这里我们可以采用面向对象的方式,将扑克牌抽象成一个类,其中包含牌面、花色、牌型等属性和方法。比较时,可以定义一个比较函数,将两张牌进行比较,返回较大的那张牌。具体实现可以参考如下代码: ```php class Poker { private $face; private $suit; public function __construct($face, $suit) { $this->face = $face; $this->suit = $suit; } public function compare($other) { if ($this->face > $other->face) { return $this; } else if ($this->face < $other->face) { return $other; } else { // 如果牌面相同,则比较花色 if ($this->suit > $other->suit) { return $this; } else { return $other; } } } } ``` 这里我们定义了一个Poker类,包含了牌面和花色两个属性,以及一个比较函数compare。比较函数首先比较牌面大小,如果牌面相同则比较花色大小。在比较花色时,我们可以将花色定义为一个整数,红桃为1,方块为2,梅花为3,黑桃为4,这样可以方便地比较大小。 在实际使用中,我们可以生成一副扑克牌,然后进行洗牌和发牌,最后比较两张牌的大小。具体实现可以参考如下代码: ```php // 生成一副扑克牌 $poker = array(); for ($i = 1; $i <= 13; $i++) { $poker[] = new Poker($i, 1); // 红桃 $poker[] = new Poker($i, 2); // 方块 $poker[] = new Poker($i, 3); // 梅花 $poker[] = new Poker($i, 4); // 黑桃 } // 洗牌 shuffle($poker); // 发牌 $hand1 = array(); $hand2 = array(); for ($i = 0; $i < 5; $i++) { $hand1[] = array_shift($poker); $hand2[] = array_shift($poker); } // 比较牌面大小 $max1 = $hand1[0]; $max2 = $hand2[0]; foreach ($hand1 as $card) { $max1 = $max1->compare($card); } foreach ($hand2 as $card) { $max2 = $max2->compare($card); } // 输出结果 if ($max1->compare($max2) === $max1) { echo "Hand 1 wins\n"; } else { echo "Hand 2 wins\n"; } ``` 这里我们生成了一副扑克牌,然后进行洗牌,接着分别发给两个玩家5张牌。最后,我们比较两张牌的大小,输出比较结果。这里我们假设了只有两个玩家,实际上可以根据需要进行扩展。 希望这个简单的示例能够帮助你理解如何用PHP实现扑克牌比大小。如果你还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值