35. 数组
数组是一种复合数据,可以装下多个值,每个值用不同的键来区分。
<?php
$arr = array('001' => '张三', '002' => '李四');
var_dump($arr);
?>
36. 索引数组、关联数组、多维数组
索引数组,键不必有特殊意义,纯数字,例:
<?php
$arr = array(0 => '张三', 1 => '李四', 2 => ’王五‘, 3 => ’马六‘);
var_dump($arr);
?>
关联数组,字符串做键,一般能体现单元格的内容,例:
<?php
$arr = array('no' => '0001', name => '李四', score => 90, 'sex' => ’男‘);
var_dump($arr);
?>
多维数组,数组里面嵌套数组,层数即为维数,例:
<?php
// 多维数组
$arr = array('student' => array('lisi' => array('yuwen' => 85, 'shuxue' => 90), 'zhangsan' => array('yuwen' => 68, 'shuxue' => 96)));
print_r($arr);
?>
37. 键的规则
如果不声明键,会以0,1,2,3、、、递增来生成键。例:
<?php
// 没声明键值,自动以数字来递增填充
$arr = array('a', 'b', 'c', 'd');
print_r($arr);
?>
如果已经存在某个或几个数字键,则以最大数字键开始递增生成数字键,例:
<?php
// 部分没声明键值
$arr = array(8 => 'a', 3 => 'a', 'c', 'd');
print_r($arr);
?>
如果键声明重复了,则后面的值覆盖前面的值,例:
<?php
// 键值重复,后面的将覆盖前面的
$arr = array(3 => 'a', 3 => 'b', 'c');
print_r($arr);
?>
键可以是整数,也可以是字符串。
如果键值是浮点数,自动转成整数。
如果键值为字符串,且字符串的内容恰好是整数,也理解成整数。
例:
<?php
$arr = array(1 => '中', 1.5 => '国', '1.5' => '象', 2 => '棋', '2' => '好');
print_r($arr);
// 总结:
// 1.5 是浮点型,自动转成整型,即舍去小数点后的数字,为1,。因为前面有一个键值为1,所以覆盖前面的内容。’中‘ 被 ’国‘ 覆盖。
// ’1.5‘ 是字符串,字符串可以做键值,所以正常显示。’象‘
// ’2‘ 是字符串,但是恰好是整数,所以算是整数,因为前面已有一个键值为2,随意覆盖前面的内容。’棋‘ 被 ’好‘覆盖。
// 所以,显示 ’国‘、’象‘、’好‘
?>
38. 操作数组单元
①增加
<?php
$arr = array('a', 'b', 3 => 'c');
// 1. 无指定键值,结果:放在当前数组的最后位置
$arr[] = 'd';
print_r($arr);
// 2. 指定键值,结果:放在指定键值的位置上,如果指定键值已有,则直接覆盖
$arr[11] = 'e';
print_r($arr);
// 3. 利用函数array_push,从最后位置插入一个元素,结果:新元素被放置在最后,重新排列键值
array_push($arr, 'f');
print_r($arr);
// 4. 利用函数array_unshift,从头部压入一个元素,结果:新元素被放置在最前面,重新排列键值
array_unshift($arr, 'g');
print_r($arr);
?>
②读取
<?php
$arr = array('a', 'b', 3 => array('c', 'd'));
// 读取一维数组的元素
echo $arr[1]; // b
// 读取多维数组的元素
echo $arr[3][0]; // c
?>
③修改
<?php
// 找到相应的键值,直接修改即可
$arr = array('a', 'b', 3 => array('c', 'd'));
$arr[0] = 'A';
print_r($arr);
?>
④删除
<?php
$arr = array('a', 'b', 3 => 'c', 'd');
// 1. 删除当前数组中指定键值的元素
unset($arr[1]);
print_r($arr);
// 2. 删除数组中最后一个元素
array_pop($arr);
print_r($arr);
// 3. 删除数组中最前面一个元素
array_shift($arr);
print_r($arr);
?>
39. 循环数组
<?php
$arr = array('a', 'b', 'c', 'd');
// 1. 使用for循环,根据下标遍历。缺点:只能用于索引数组,且键值连续。
for($i = 0; $i < count($arr);; $i++)
{
echo $i ,'~~', $arr[$i] , '<br>';
}
// 2. 使用foreach循环,根据数组元素按顺序一个一个遍历。适用于所有数组。
foreach($arr as $key => $value)
{
echo $key ,'~~', $value , '<br>';
}
// 注意:使用foreach循环时,可以不用声明键名,根据实际情况而定,例:
foreach($arr as $value)
{
echo $value , '<br>';
}
?>
40. 游标操作
对于数组的遍历,还可以使用游标来控制。游标,表示一个虚拟的标记,标记了当前正处于数组的哪个元素上。常见的几个游标函数:
函数 | 描述 |
---|---|
current() | 取当前游标指向的数组单元的值 |
next() | 把数组的游标往后移一位 |
prev() | 把数组的游标往前移一位 |
end() | 把数组的游标移到最后 |
reset() | 把数组的游标复位至初始位置 |
<?php
$arr = array('a', 'b', 'c', 'd');
// 当前游标指向
echo current($arr); // a
// 游标后移一位
next($arr);
echo current($arr); // b
// 游标移到最后
end($arr);
echo current($arr); // d
/// 游标前移一位
prev($arr);
echo current($arr); // c
// 重置游标位置
reset($arr);
echo current($arr); // a
?>
41. 数组的常用函数
-
变量是否是数组:
is_array($arr) -
检测数组内是否存在某键值:
array_key_exists(键值, 数组) -
检测数组内是否存在某元素:
in_array(值, 数组) -
往数组尾部加入一个单元,并返回操作后的数组长度
array_push(数组, 值) -
从数组尾部弹出一个单元,并返回所弹单元的值
array_pop(数组) -
往数组头部压入一个单元,并返回操作后的数组长度
array_unshift(数组, 值) -
从数组的头部弹出一个单元,返回所弹单元的值
array_shift(数组)
<?php
$arr = array(2 => 'a', 5 => 'b', '8a' => 'c', '1.5' => 'd');
// is_array
if(is_array($arr)){
echo '该变量是数组';
}else{
echo '该变量不是数组';
}
// array_key_exists
if(array_key_exists('1.5', $arr)){
echo '存在该单元';
}else{
echo '不存在该单元';
}
// in_array
if(in_array('c', $arr)){
echo '存在该元素';
}else{
echo '不存在该元素';
}
?>
42. 数组案例
题:一只羊,第三年生一只羊,第四年生一只羊,第五年死亡。20年后一共有多少只养?
<?php
$yang = array(1, 0, 0, 0, 0);
for($i = 1; $i <= 20; $i++){
$tmp = $yang[2] + $yang[3];
array_unshift($yang, $tmp);
array_pop($yang);
}
$count = array_sum($yang);
echo '20年后一共有:'. $count;
?>
43. 超级全局变量
名称 | 描述 |
---|---|
$_GET | 地址栏上获得的值 |
$_POST | post表单发送的数据 |
$_REQUEST | 基友GET,也有POST的数据 |
$_ENV | 容易暴露服务器信息,一般不允许显示 |
$_SERVER | 获取网站的域名,及当前访问的脚本,客户的IP等 |
test.html
<form action="test.php?id=999&username=zhangsan" method="post">
<input type="text" name="username" />
<input type="submit" value="提交" />
</form>
test.php
<?php
print_r($_GET);
print_r($_POST);
print_r($_REQUEST);
?>
44. 常量
define(name, value, [bool])
声明后,值不能修改,也不能销毁,也不能重新声明。
<?php
define('PI', 3.14);
echo PI;
?>
命名规范:常量名称前面不加 $,和变量一样,只不过习惯上全大写。
声明常量后,在页面任一位置都可以访问。
第三个参数代表是否区分大小写,默认FALSE,即区分大小写。
检测常量是否存在,defined(常量名)
<?php
if(defined('PI')){
echo '常量已存在';
}else{
define('PI', 3.14);
}
echo PI;
?>
45. 文件包含
include() 可重复引入
include_once() 只引入一次,速度慢
require() 可重复引入
require_once() 只引入一次
test.php
$age = 18;
$tmp = 'I'm from temp.php';
index.php
<?php
include('test.php'); // 相当于把test.php中的内容替换到本行
echo $age;
echo $tmp;
?>
include和require区别:
如果引入的文件不存在,include尽量往下执行,报warning;require则直接报fetal error,脚本立即停止执行。