• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

第2章 0419-流程控制与数组遍历

Data: 2019-03-23 09:14:37Form: JournalClick: 1

demo1:数据类型
<?php
// 数据类型

// ! 1. 基本类型: 不可再分

// int / float
$age = 30;
$price = 99.66;

// string
$username = 'admin';

// boolean
$isDel = true;

// ! 2. 复合类型: 数组,对象
// 数组
$arr = [30, 99.66, 'admin', true, function () {
}, [1, 2, 3]];
// 对象
$obj = new class(123456)
{
    private $salary;
    public function __construct($salary)
    {
        $this->salary = $salary;
    }

    // 访问器
    public function __get($name)
    {
        return $this->salary;
    }
};
echo gettype($obj);
echo '工资是: ', $obj->salary;


// ! 3. 特殊类型: null, 资源
// 1. null, 2.没赋值, 3. unset()删除了一个变量
$x = 123;
unset($x);
if (is_null($x)) echo 'NULL';
echo '<br>';
$f = fopen('readme.txt', 'r');
echo gettype($f);

echo '<hr>';

// ! 4. 回调类型: callback

/**
 * php用字符串传递函数, 所以可以用任何方式来引用或传递函数,当成值/数据类型
 * 回调的表现形式, 不仅仅"函数, 对象方法, 类方法"
 * 接受回调为参数的函数或方法很多, array_filter
 */

function hello(string $name): string
{
    return 'Hello ' . $name;
}

echo hello('猪老师'), '<br>';
// 回调的方式来调用函数, 同步
echo call_user_func('hello', '猪老师');

echo '<hr>';

// 函数做为对象方法
class Demo1
{
    public function hello(string $name): string
    {
        return 'Hello ' . $name;
    }
}


// 'hello'是对象方法,用对象访问
// echo call_user_func([对象,方法], '猪老师');
echo call_user_func([(new Demo1), 'hello'], '马老师');
echo '<hr>';

// 类方法
class Demo2
{
    public static function hello(string $name): string
    {
        return 'Hello ' . $name;
    }
}

echo call_user_func(['Demo2', 'hello'], '牛老师');

// 类型声明
demo2:流程控制: 分支
<?php
// ! 流程控制: 分支

$age = 15;

// * 1. 单分支
if ($age >= 18) {
    echo '恭喜, 已成年,可以观看<br>';
}

// * 2. 双分支
// if ($age >= 18) {
//     echo '恭喜, 已成年,可以观看<br>';
// } else {
// 默认分支
//     echo '未成年, 请在家长陪同下观看<br>';
// }
// 分支只有一行代码,可以不写大括号
// $age = 38;
if ($age >= 18)
    echo '恭喜, 已成年,可以观看<br>';
else
    // 默认分支
    echo '未成年, 请在家长陪同下观看<br>';


// * 3. 多分支

$age = 44;
if ($age >= 18 && $age < 30)
    echo "{$age}岁, 彩礼, 能按揭吗? <br>";
else if ($age >= 30 && $age < 45)
    echo "{$age}岁, 应该成个家了 <br>";
else if ($age >= 45)
    echo "{$age}岁, 房贷快还完了 <br>";
// 未成年, < 18, 默认分支
else
    echo "{$age}岁, 放学了, 我送你回家 <br>";


// * 4. 多分支的语法糖:switch
$age = 15;
switch (true) {
    case $age >= 18 && $age < 30:
        echo "{$age}岁, 彩礼, 能按揭吗? <br>";
        break;
    case $age >= 30 && $age < 45:
        echo "{$age}岁, 应该成个家了 <br>";
        break;
    case $age >= 45:
        echo "{$age}岁, 房贷快还完了 <br>";
        break;
    default:
        echo "{$age}岁, 放学了, 我送你回家 <br>";
}
demo3:流程控制: 循环
<?php
// ! 流程控制: 循环
// 循环本质上还是"分支"
$colors = ['red', 'green', 'blue'];
// [0,1,2]
// echo $colors[1] . '<br>';

// 1. 初始化循环变量,这里用索引当循环变量, $i=0;指向第一个数组元素
// $i = 0;

// 2. 循环条件
// 数组长度 = 最大索引 + 1
// 3 = 2 + 1
// echo count($colors);
// if ($i < count($colors)) {
//     echo $colors[$i] . '<br>';
// }

// 3. 更新循环条件
// $i = $i + 1;
// if ($i < count($colors)) {
//     echo $colors[$i] . '<br>';
// }
// $i = $i + 1;
// if ($i < count($colors)) {
//     echo $colors[$i] . '<br>';
// }
// echo '<hr>';
/**
 * 循环三要素:
 * 1. 初始化循环变量: $i =0;
 * 2. 循环条件: $i < count($colors);
 * 3. 更新循环条件: $i = $i + 1
 */

// *  while() 来简化以上的分支过程
$list  = '<ul style="border:1px solid;background: lightcyan">';

$i = 0;
while ($i < count($colors)) {
    $list .= "<li>{$colors[$i]}</li>";
    // 更新条件
    $i = $i + 1;
}

$list .= '</ul>';

echo $list;

// while 还有一个双胞胎, do-while 与上面的区别在于条件判断的时机不同
$list  = '<ul style="border:1px solid;background: lightgreen">';

$i = 0;
do {
    $list .= "<li>{$colors[$i]}</li>";
    // 更新条件
    $i = $i + 1;
} while ($i > count($colors));

$list .= '</ul>';

echo $list;

// for 可看成 while 的语法糖
$list  = '<ul style="border:1px solid;background: violet">';
for ($i = 0; $i < count($colors); $i++) {
    $list .= "<li>{$colors[$i]}</li>";
}
$list .= '</ul>';
echo $list;

// 中断或跳过某次循环
// break; continue
$list  = '<ul style="border:1px solid;background: pink">';
for ($i = 0; $i < count($colors); $i++) {
    // 只输出前二个
    // if ($i > 1) break;
    // 跳过第2个,只输出第1个和第3个
    if ($i === 1) continue;
    $list .= "<li>{$colors[$i]}</li>";
}
$list .= '</ul>';
echo $list;
demo4:数组声明与遍历
<?php
// ! 数组声明与遍历

// !(一) 数组声明

$colors = ['red', 'green', 'blue'];
// printf('<pre>%s</pre>', print_r($colors, true));

// * 1. 索引数组: 键名是从0开始的递增的整数
// $colors = [0 => 'red', 1 => 'green', 2 => 'blue'];
// printf('<pre>%s</pre>', print_r($colors, true));

// * 2. 关联数组: 键名是字符串
// $user = ['id' => 5, 'name' => '猪老师', 'score' => 90];
// printf('<pre>%s</pre>', print_r($user, true));
// echo $user['name'];

// * 二者关系
// 索引数组实际上关联数组的一个子集,只不过用了数字型的字符串
// $colors = ['0' => 'red', '1' => 'green', '2' => 'blue'];
// printf('<pre>%s</pre>', print_r($colors, true));
// echo $colors[1], '<br>';
// echo $colors['1'], '<br>';

// ! 2 数组遍历
// while,for
// 数组成员还可以是一个数组,多维数组: 二维数组
// 数据表的查询结果,就是用"二维数组"来表示
$users = [
    0 => ['id' => 5, 'name' => '猪老师', 'gender' => 0, 'age' => 18],
    1 => ['id' => 6, 'name' => '牛老师', 'gender' => 1, 'age' => 30],
    2 => ['id' => 5, 'name' => '狗老师', 'gender' => 0, 'age' => 35],
];

// foreach
// foreach (数组  as 键名=>值) {...} , 键名是可选的
$table = '<table border="1" width="400" cellspacing="0" cellpadding="3" align="center">';
$table .= '<caption>用户信息表</caption>';
$table .= '<thead bgcolor="#ccc"><tr><th>id</th><th>用户名</th><th>性别</th><th>年龄</th></tr></thead>';
$table .= '<tbody align="center">';

// 遍历这个二维数组
foreach ($users as  $user) {
    // $user 还是一个数组
    print_r($user);

    $table .= '<tr>';
    $table .= '<td>' . $user['id'] . '</td>';
    $table .= '<td>' . $user['name'] . '</td>';
    // 1->true, 0->false
    $table .= '<td>' . ($user['gender'] ? '女' : '男') . '</td>';
    $table .= '<td>' . $user['age'] . '</td>';

    $table .= '</tr>';
}
$table .= '</tbody></table>';

echo $table;

// php是天生的模板语法
demo5:用二维数组来模拟数据表查询结果集
<?php
// 用二维数组来模拟数据表查询结果集
$stus = [
    ['id' => 1, 'name' => '刘备', 'course' => 'js', 'score' => 83],
    ['id' => 2, 'name' => '关羽', 'course' => 'php', 'score' => 75],
    ['id' => 3, 'name' => '张飞', 'course' => 'js', 'score' => 52],
    ['id' => 4, 'name' => '孙权', 'course' => 'php', 'score' => 88],
    ['id' => 5, 'name' => '周瑜', 'course' => 'js', 'score' => 65],
    ['id' => 6, 'name' => '孔明', 'course' => 'php', 'score' => 53],
    ['id' => 7, 'name' => '赵云', 'course' => 'js', 'score' => 63],
    ['id' => 8, 'name' => '马超', 'course' => 'js', 'score' => 77],
    ['id' => 9, 'name' => '姜维', 'course' => 'php', 'score' => 93],
    ['id' => 10, 'name' => '黄忠', 'course' => 'js', 'score' => 81],
]
?>

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>php与html原生混编</title>
    <style>
        table {
            border-collapse: collapse;
            width: 360px;
            text-align: center;
        }

        table th,
        table td {
            border: 1px solid #000;
            padding: 5px;
        }

        table caption {
            font-size: 1.3em;
        }

        table thead {
            background-color: lightcyan;
        }

        .active {
            color: red;
        }
    </style>
</head>

<body>

    <table>
        <caption>学生成绩表</caption>
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>课程</th>
                <th>成绩</th>
            </tr>
        </thead>

        <tbody>
            <!-- 这里显示的用户数据 -->
            <?php
            foreach ($stus as $stu) {
                // echo "<tr>";
                // echo "<td>{$stu['id']}</td>";
                // echo "<td>{$stu['name']}</td>";
                // echo "<td>{$stu['course']}</td>";
                // echo "<td>{$stu['score']}</td>";
                // echo "</tr>";

                // heredoc, 写模板, 可以解析内部变量
                // echo <<< STU
                //     <tr>
                //         <td>{$stu['id']}</td>
                //         <td>{$stu['name']}</td>
                //         <td>{$stu['course']}</td>
                //         <td>{$stu['score']}</td>
                //     </tr>
                // STU;

                // 只查php
                if ($stu['course'] === 'php') {
                    echo <<< STU
                    <tr>
                        <td>{$stu['id']}</td>
                        <td>{$stu['name']}</td>
                        <td class="active">{$stu['course']}</td>
                        <td>{$stu['score']}</td>
                    </tr>
                STU;
                }
            }
            ?>
        </tbody>
    </table>

</body>

</html>
demo6:php流程控制的模板语法/替代语法
<?php
// 用二维数组来模拟数据表查询结果集
$stus = [
    ['id' => 1, 'name' => '刘备', 'course' => 'js', 'score' => 83],
    ['id' => 2, 'name' => '关羽', 'course' => 'php', 'score' => 75],
    ['id' => 3, 'name' => '张飞', 'course' => 'js', 'score' => 52],
    ['id' => 4, 'name' => '孙权', 'course' => 'php', 'score' => 88],
    ['id' => 5, 'name' => '周瑜', 'course' => 'js', 'score' => 65],
    ['id' => 6, 'name' => '孔明', 'course' => 'php', 'score' => 53],
    ['id' => 7, 'name' => '赵云', 'course' => 'js', 'score' => 63],
    ['id' => 8, 'name' => '马超', 'course' => 'js', 'score' => 77],
    ['id' => 9, 'name' => '姜维', 'course' => 'php', 'score' =>
Name:
<提交>