1. 数组的种类与定义与访问方式
数组主要分为两种:索引数组,关联数组,多维数组
索引数组:以数字为键值,默认从 0 开始,递增 1
关联数组:带有指定的键值,每个键关联一个值
多维数组:包含一个或多个数组的数组
<?php
//1.索引数组,以数字为键值,默认从0开始,逐个+1
//1.1 直接申明
$arr1 = [0 => '电脑', 1 => '键盘', 2 => '鼠标', 3 => '手机'];
//1.2 追加的方式创建
$arr2 = [];
$arr2[] = '电脑';
$arr2[] = '键盘';
$arr2[] = '鼠标';
$arr2[] = '手机';
printf("<pre>%s</pre>", print_r($arr1, true));
printf("<pre>%s</pre>", print_r($arr2, true));
//访问数组中第一个元素
echo $arr1[0], '<br>';
//访问数组中最后一个元素
echo $arr1[3], '<br>';
//2.关联数组,使用指定的键,每一个键对应一个值
$info = [
'id' => 101,
'name' => 'demo',
'age' => 27
];
printf("<pre>%s</pre>", print_r($info, true));
echo '姓名: ' . $info['name'] . ' , 年龄: ' . $info['age'] . '<br>';
//3.多维数组,有一个或者多个数组组成的数组
$users = [
0 => ['id' => 100, 'name' => 'demo1', 'age' => 22],
1 => ['id' => 101, 'name' => 'demo2', 'age' => 23],
2 => ['id' => 102, 'name' => 'demo3', 'age' => 24],
];
echo '姓名: ' . $users[0]['name'] . ' , 年龄: ' . $users[0]['age'] . '<br>';
echo '姓名: ' . $users[1]['name'] . ' , 年龄: ' . $users[1]['age'] . '<br>';
echo '姓名: ' . $users[2]['name'] . ' , 年龄: ' . $users[2]['age'] . '<br>';
代码执行结果如图:
2. 数组的遍历有几种,实例实现
数组的遍历可以分为以下几种:
- 通过指针,逐个遍历
- 通过 while 循环遍历
- 通过 for 循环遍历
- foreach()遍历
<?php
//数组的遍历
$info = [
'id' => 101,
'name' => 'demo',
'age' => 27,
'course' => 'php'
];
//1.通过指针,逐个遍历
//key()获取当前数组的键,current() 获取数组的值
printf('[ %s ] => %s <br>', key($info), current($info));
next($info); //指针下移
printf('[ %s ] => %s <br>', key($info), current($info));
next($info);
printf('[ %s ] => %s <br>', key($info), current($info));
next($info);
printf('[ %s ] => %s <br>', key($info), current($info));
echo '<hr>';
//指针前移,指向上一个元素
prev($info);
printf('[ %s ] => %s <br>', key($info), current($info));
prev($info);
printf('[ %s ] => %s <br>', key($info), current($info));
prev($info);
printf('[ %s ] => %s <br>', key($info), current($info));
echo '<hr>';
//指针复位,指向第一个元素
reset($info);
printf('[ %s ] => %s <br>', key($info), current($info));
//指针指向最后一个元素
end($info);
printf('[ %s ] => %s <br>', key($info), current($info));
echo '<hr>';
//2.通过while循环遍历
reset($info);
while (true) {
printf('[ %s ] => %s <br>', key($info), current($info));
// 下一个元素如果为空,循环结束
if (!next($info)) break;
}
echo '<hr>';
//3.通过for循环遍历
//计算数组元素的个数,作为循环次数
reset($info);
$num = count($info);
//echo $num;
for ($i = 0; $i < $num; $i++) {
printf('[ %s ] => %s <br>', key($info), current($info));
next($info);
}
//4.foreach()遍历 指针自动下移
echo '<hr>';
reset($info);
foreach ($info as $key => $val) {
printf('[ %s ] => %s <br>', $key, $val);
}
代码执行结果如图:
3.数组函数
<?php
//数组函数
//数组解构 list() 不是函数,函数不能放在等号左边,是语法结构
list($a, $b, $c) = [100, 101, 102];
echo $a . ' --- ' . $b . ' --- ' . $c . '<br>';
$info = [
'id' => 101,
'name' => 'demo',
'age' => 27,
'course' => 'php'
];
//php7.1版本后支持关联数组
list('id' => $id, 'name' => $name, 'age' => $age, 'course' => $course) = $info;
echo 'ID: ' . $id . ' 姓名: ' . $name . ' 年龄: ' . $age . ' 报名课程: ' . $course . '<br>';
$users = [
['id' => 100, 'name' => 'demo1', 'age' => 22, 'course' => 'php'],
['id' => 101, 'name' => 'demo2', 'age' => 23, 'course' => 'javascript'],
['id' => 102, 'name' => 'demo3', 'age' => 24, 'course' => 'html'],
];
//1.数组遍历函数 foreach()
foreach ($users as $user) {
echo 'ID: ' . $user['id'] . ' 姓名: ' . $user['name'] . ' 年龄: ' . $user['age'] . ' 报名课程: ' . $user['course'] . '<br>';
}
//可以使用list()将as 的数组解构
foreach ($users as list('id' => $id, 'name' => $name, 'age' => $age, 'course' => $course)) {
echo 'ID: ' . $id . ' 姓名: ' . $name . ' 年龄: ' . $age . ' 报名课程: ' . $course . '<br>';
}
//2.array_keys 获取数组的键,组成一个新数组
echo '<hr>';
$keys = array_keys($info);
printf("<pre>%s</pre>", print_r($keys, true));
echo '<hr>';
//3.array_keys_exists() 判断一个字符串是否是数组的键
$info = [
'id' => 101,
'name' => 'demo',
'age' => 27,
'course' => 'php'
];
//$key = 'name';
$key = 'Name';
//判断$key 是否是数组$info的键
if (array_key_exists($key, $info)) {
echo $key . ' 是数组的建名<br>';
} else {
echo $key . ' 不是数组的建名<br>';
}
echo '<hr>';
//4.array_value() 获取数组的值,重新组成一个数组,通常用于重置数组的键
$new_info = array_values($info);
printf("<pre>%s</pre>", print_r($new_info, true));
//5. in_array()判断一个值是否在数组中
$courses = ['php7.2', 'html5', 'javascript', 'css3'];
//$course = 'php7';
$course = 'php7.2';
if (in_array($course, $courses)) {
echo $course . ' 在数组中<br>';
} else {
echo $course . ' 不在数组中<br>';
}
//或者可以使用array_search() 查询数组中是否有指定的元素,如果存在返回对应的键名,不存在返回false
//echo array_search($course, $courses);
if (array_search($course, $courses) !== false) {
echo $course . ' 在数组中<br>';
} else {
echo $course . ' 不在数组中<br>';
}
//6.array_unique() 用于数组的去重
$arr = [101, 102, 103, 104, 199, 188, 102, 104, 99];
printf("<pre>%s</pre>", print_r($arr, true));
$arr = array_unique($arr);
printf("<pre>%s</pre>", print_r($arr, true));
//7.array_sum() 用于计算数组内值的和
$sum = array_sum($arr);
echo $sum;
//8.栈和队列
//栈操作 先进后出
//array_push() 从尾部进入
//array_pop() 从尾部取出,返回被取出的值
$arr = [];
array_push($arr, 1);
array_push($arr, 2);
array_push($arr, 3, 4, 5);
printf("<pre>%s</pre>", print_r($arr, true));
$first = array_pop($arr);
$second = array_pop($arr);
echo $first, '<br>';
echo $second, '<br>';
printf("<pre>%s</pre>", print_r($arr, true));
//队列操作 后进先出
//array_unshift() 入队操作
//array_shift() 出队操作
$arr = [];
array_unshift($arr, 10);
array_unshift($arr, 9);
array_unshift($arr, 8);
array_unshift($arr, 7, 6);
printf("<pre>%s</pre>", print_r($arr, true));
$first = array_shift($arr);
$second = array_shift($arr);
echo $first, '<br>';
echo $second, '<br>';
printf("<pre>%s</pre>", print_r($arr, true));
echo '<hr>';
//8.排序
// 8.1 sort() 数组升序排列
$arr = [
'apple' => 11,
'huawei' => 40,
'xiaomi' => 10
];
sort($arr);
printf("<pre>%s</pre>", print_r($arr, true));
//8.2 rsort() 数组降序排列
$arr = [
'apple' => 11,
'huawei' => 40,
'xiaomi' => 10
];
rsort($arr);
printf("<pre>%s</pre>", print_r($arr, true));
//8.3 asort() 根据关联数组的值进行升序排列
$arr = [
'apple' => 11,
'huawei' => 40,
'xiaomi' => 10
];
asort($arr);
printf("<pre>%s</pre>", print_r($arr, true));
//8.4 arsort() 根据关联数组的值进行降序排列
$arr = [
'apple' => 11,
'huawei' => 40,
'xiaomi' => 10
];
arsort($arr);
printf("<pre>%s</pre>", print_r($arr, true));
//8.5 ksort() 根据关联数组的键进行升序排列
$arr = [
'apple' => 11,
'huawei' => 40,
'xiaomi' => 10
];
ksort($arr);
printf("<pre>%s</pre>", print_r($arr, true));
//8.6 krsort() 根据关联数组的键进行降序排列
$arr = [
'apple' => 11,
'huawei' => 40,
'xiaomi' => 10
];
krsort($arr);
printf("<pre>%s</pre>", print_r($arr, true));
echo '<hr>';
//9. extract() 将关联数组的键作为一个变量名,值作为一个变量的值
$arr = ['id' => 101, 'name' => 'demo', 'age' => 18];
extract($arr);
echo 'ID: ' . $id . ' 姓名: ' . $name . ' 年龄: ' . $age . '<br>';
代码执行结果如图:
4.mysqli 面向对象实现常用的 CURD 操作
实现常用的 CURD 操作,首先,先连接数据库
<?php
//连接数据库
//载入配置
$conf = require "config.php";
//将配置数组分解成独立变量
extract($conf);
$mysqli = new mysqli($host, $username, $password, $dbname);
//如果mysqli对象的connect_errno 的值不为0 ,返回错误信息,并终止程序
if ($mysqli->connect_errno) die('连接失败:' . $mysqli->connect_error);
//设置字符编码集
$mysqli->set_charset($charset);
数据库配置文件 config.php
<?php
return [
//类型
'type' => $type ?? 'mysql',
//主机名
'host' => $host ?? 'localhost',
//用户
'username' => $username ?? 'root',
//密码
'password' => $password ?? 'root',
//默认端口
'port' => $port ?? '3306',
//默认编码集
'charset' => $charset ?? 'utf8',
//默认数据库
'dbname' => $dbname ?? 'php_edu'
];
1.使用 mysqli 面向对象实现新增操作(INSERT)
新增单条数据
<?php
//mysqli面向对象实现新增操作(INSERT)
//1.连接数据库
require "connect.php";
//2.操作数据表
//生成sql语句的模版对象
//$sql = "INSERT `users` (`name`,`email`,`password`) VALUES (?,?,?);";
$sql = "INSERT `users` SET `name`=? , `email`=? , `password`=?;";
//prepare相当于sql语句的构造方法,用于创建一个预处理对象(sql语句对象)
//在执行时给模版中的占位符赋值
$stmt = $mysqli->prepare($sql);
//给占位符绑定变量名 s :字符串 i: 整数
$stmt->bind_param('sss', $name, $email, $password);
$arr = [
'name' => 'demo1',
'email' => 'demo1@qq.com',
'password' => sha1('123'),
];
extract($arr);
//执行sql 语句,如果失败,打印出出错信息
$stmt->execute() or die($stmt->error);
//对执行结果进行处理
//$stmt->affected_rows 返回影响条数
//$stmt->insert_id 返回新增数据的ID
printf('成功新增 %s 条记录,新增的主键ID为: %d' , $stmt->affected_rows,$stmt->insert_id);
//关闭连接
$mysqli->close();
代码执行结果如图:
新增多条记录
<?php
//mysqli面向对象实现新增多条数据操作(INSERT)
//1.连接数据库
require "connect.php";
//2.操作数据表
//生成sql语句的模版对象
$sql = "INSERT `users` SET `name`=? , `email`=? , `password`=?;";
//prepare相当于sql语句的构造方法,用于创建一个预处理对象(sql语句对象)
//在执行时给模版中的占位符赋值
$stmt = $mysqli->prepare($sql);
//给占位符绑定变量名 s :字符串 i: 整数
$stmt->bind_param('sss', $name, $email, $password);
$uses = [
['name' => 'demo1', 'email' => 'demo1@qq.com', 'password' => sha1('123')],
['name' => 'demo2', 'email' => 'demo2@qq.com', 'password' => sha1('456')],
['name' => 'demo3', 'email' => 'demo3@qq.com', 'password' => sha1('789')],
];
foreach ($uses as $user) {
extract($user);
if ($stmt->execute())
printf('成功新增 %s 条记录,新增的主键ID为: %d <br>', $stmt->affected_rows, $stmt->insert_id);
else
die(printf('新增失败,%d %s', $stmt->errno, $stmt->error));
}
//关闭连接
$mysqli->close();
代码执行结果如下:
2.使用 mysqli 面向对象实现更新操作(UPDATE)
<?php
//mysqli面向对象实现更新操作(UPDATE)
//1.连接数据库
require "connect.php";
//2.操作数据表
//生成sql语句的模版对象 更新必须加上更新条件
$sql = "UPDATE `users` SET `name`=? , `email`=? , `password`=? WHERE `id`=?;";
//在执行时给模版中的占位符赋值
$stmt = $mysqli->prepare($sql);
//给占位符绑定变量名 s :字符串 i: 整数
$stmt->bind_param('sssi', $name, $email, $password, $id);
$arr = [
'name' => '龙傲天',
'email' => 'lat@qq.com',
'password' => sha1('666666'),
'id' => 8
];
extract($arr);
//执行sql 语句,如果失败,打印出出错信息
$stmt->execute() or die($stmt->error);
//对执行结果进行处理
if ($stmt->affected_rows === 1)
printf('成功更新 %s 条记录', $stmt->affected_rows);
else echo '没有可更新数据';
//关闭连接
$mysqli->close();
代码执行结果如图:
3.使用 mysqli 面向对象实现删除操作(DELETE)
<?php
//mysqli面向对象实现删除操作(DELETE)
//1.连接数据库
require "connect.php";
//2.操作数据表
//生成sql语句的模版对象 删除操作一定要加删除条件
//删除单条数据
$sql = "DELETE FROM `users` WHERE `id`=?;";
//删除一定范围数据
//$sql = "DELETE `users` WHERE `id`>?;";
//在执行时给模版中的占位符赋值
$stmt = $mysqli->prepare($sql);
//给占位符绑定变量名 s :字符串 i: 整数
$stmt->bind_param('i', $id);
$id = 9;
//执行sql 语句,如果失败,打印出出错信息
$stmt->execute() or die($stmt->error);
//对执行结果进行处理
if ($stmt->affected_rows)
printf('成功删除 %s 条记录', $stmt->affected_rows);
else echo '没有可删除数据';
//关闭连接
$mysqli->close();
代码执行结果如图:
4.使用 mysqli 面向对象实现查询操作(SELECT)
1.使用fetch_all()
和foreach()
显示数据
<?php
//mysqli面向对象实现查询操作(SELECT)
//1.连接数据库
require "connect.php";
//2.操作数据表
//生成sql语句的模版对象
$sql = "SELECT `id`,`name`,`email` FROM `users` WHERE `id` > ? ;";
//prepare相当于sql语句的构造方法,用于创建一个预处理对象(sql语句对象)
//在执行时给模版中的占位符赋值
$stmt = $mysqli->prepare($sql);
//给占位符绑定变量名 s :字符串 i: 整数
$stmt->bind_param('i', $id);
$id = 10;
//执行sql 语句,如果失败,打印出出错信息
$stmt->execute() or die($stmt->error);
//对执行结果进行处理
//查询操作 execute() 执行后会生成一个结果集对象
//get_result() 获取结果集对象
$res = $stmt->get_result();
if ($res->num_rows === 0) exit('结果为空');
//获取所有记录 MYSQLI_ASSOC 返回关联的部分
$users = $res->fetch_all(MYSQLI_ASSOC);
//对获取的数据进行处理
echo "<table border='1' cellspacing='0' cellpadding='10'>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>姓名</th>";
echo "<th>邮箱</th>";
echo "</tr>";
foreach ($users as $user) {
echo "<tr>";
echo "<th>" . $user['id'] . "</th>";
echo "<th>" . $user['name'] . "</th>";
echo "<th>" . $user['email'] . "</th>";
echo "</tr>";
}
echo "</table>";
//释放结果集
$res->free();
//关闭连接
$mysqli->close();
2.使用bind_result()
,store_result()
,fetch()
和while()
方法 显示数据
<?php
//mysqli面向对象实现查询操作(SELECT) bind_result + store_result()
//1.连接数据库
require "connect.php";
//2.操作数据表
//生成sql语句的模版对象
$sql = "SELECT `id`,`name`,`email` FROM `users` WHERE `id` > ? ;";
//prepare相当于sql语句的构造方法,用于创建一个预处理对象(sql语句对象)
//在执行时给模版中的占位符赋值
$stmt = $mysqli->prepare($sql);
//给占位符绑定变量名 s :字符串 i: 整数
$stmt->bind_param('i', $id);
$id = 10;
//执行sql 语句,如果失败,打印出出错信息
$stmt->execute() or die($stmt->error);
//将当前结果的字段名称与对应的变量名进行绑定
$stmt->bind_result($id, $name, $email);
//将当前字段的值与具体变量名进行绑定
$stmt->store_result();
if ($stmt->num_rows === 0) exit('没有数据');
//对获取的数据进行处理
//使用$stmt->fetch() 自动下移指针
echo "<table border='1' cellspacing='0' cellpadding='10'>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>姓名</th>";
echo "<th>邮箱</th>";
echo "</tr>";
while ($stmt->fetch()) {
echo "<tr>";
echo "<th>" . $id . "</th>";
echo "<th>" . $name . "</th>";
echo "<th>" . $email . "</th>";
echo "</tr>";
}
echo "</table>";
//关闭连接
$mysqli->close();
代码执行结果如图: