数组:
声明:
array(元素1,元素2,...); 5.4版本之前的写法
[元素1,元素2,...];5.4版本之后(包括版本5.4)的写法,5.4版本之后也可以写array();
元素的组成:键值对,键就是这个列表的序号
键(下标) => 值
key => value
值可以存储:标量(boolean、integer(整型)、float、string)、数组、资源,不能存对象,资源一般不用数组存
下标:可以整数或字符串(JS就是从0开始的,但PHP不是)
下标也可以省略不写,如 $class = ['张三','李四','王五'];省略不写的话,会自动加下标,从0开始
key 可以是 integer 或者 string。value 可以是任意类型。
key 会有如下的强制转换:
◦ 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
◦ 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
◦ 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
◦ Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
◦ 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
$class1 = ['张三','李四','王五','赵六'];
print_r($class1);
var_dump($class1);
echo 和 print只能输出标量
var_dump();可以输出所有的类型,输出数组包括数组的数据类型、长度等
print_r也能输出所有的类型,但是只能输出值
print_r()输出结果:
Array ( [0] => 张三 [1] => 李四 [2] => 王五 [3] => 赵六 ) array(4)var_dump($class1)输出结果:
{ [0]=> string(6) "张三" [1]=> string(6) "李四" [2]=> string(6) "王五" [3]=> string(6) "赵六" }
如果指定某一个值的下标的话,那么后面的值的下标会从他开始计数
$class1 = ['张三', 3=>'李四', '王五', '赵六'];
print_r($class1);
返回值:
Array ( [0] => 张三 [3] => 李四 [4] => 王五 [5] => 赵六 )
缺省下标的取值:
下标重复不会报错,但是不能这么写。
小数下标会被取整之后再存
1.没有指定下标时,默认从0开始计数
2.有部分值有下标时:
数字下标: 如果前面没有指定下标,还是从0开始,如果中间指定了数字下标,那后面的就以这个指定的数字为准开始计数
如:
$class1 = ['张三', 3=>'李四', '王五', '赵六'];
print_r($class1);
前面没有指定下标,则从0开始
第二个值指定了数字下标3,后面的下标则从3开始
image.png
如果数字排列顺序没有按大小排,那右边的会按最大的值为起点开始继续排:
指定了第一个是3、第二个是2,不是正常的顺序,那么第三个值的下标会是以前面下标最大的那一个为准,否则,如果王五的值是以李四的2为准的话,那么下标3就会重复了。
$class1 = [3=>'张三', 2=>'李四', '王五', '赵六'];
print_r($class1);
image.png
如果不是所有的值都是字符串下标,而是只有部分值有字符串下标的情况下;默认依然从0开始,遇到字符串下标的值则跳过,没有下标的值自成一个排列
$class1 = ['张三', 'str2'=>'李四', '王五', '赵六'];
print_r($class1);
第二个值取了字符串下标,其他的值没有下标,则其他的值自成一个默认的排列,这个字符串下标自成一个排列,不干扰数字下标
image.png
字符串下标如果是字符串是数字则会被转为数字,如果字符串下标被取整型之后如果和数字下标相同,那么这个字符串下标会被舍弃:
$class1 = [3=>'张三', '2'=>'李四', 2=>'王五', '赵六'];
print_r($class1);
这里李四是字符串下标,被转成数字之后是2,王五的下标是数字2,那么字符串下标的李四就会被舍弃,因为重复了
image.png
但是如果这个字符串的下标如果不是2,而是2.2的话,会被保留:
$class1 = [3=>'张三', '2.2'=>'李四', 2=>'王五', '赵六'];
print_r($class1);
image.png
$class1 = [3=>'张三', '2.2'=>'李四', 2=>'王五', '赵六'];
$class1[] = '李雷';//增加
print_r($class1);
image.png
$class1 = ['张三', '李四', '王五', '赵六'];
array_push($class1, '李雷');//用函数添加一个元素
print_r($class1);
image.png
相当于引用传递,array_push();里的值改变了数组的值
中括号里的值表示可以装无限个值
array_push ( array &$array
, mixed $value1
[, mixed $...
] ) : int
array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。
在数组前面添加元素:
$class1 = ['张三', '李四', '王五', '赵六'];
array_unshift($class1, '李雷', '韩梅梅');//用函数在数组前面添加一个元素
print_r($class1);
image.png
在前面添加元素也有顺序,同时添加和分开添加顺序不同,后添加的排在前面:
$class1 = ['张三', '李四', '王五', '赵六'];
array_unshift($class1, '李雷');//用函数在数组前面添加一个元素
array_unshift($class1, '韩梅梅');
print_r($class1);
image.png
在数组中间添加元素:
array_splice( array &offset[, int input)[, mixed $replacement = array()]] ) : array
把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用其中的单元取代。
这个函数既可以添加,也可以删除,而且可以删除任意个数的值,删除值的个数和添加的值的个数互不干涉,可以删除任意个值,且只添加一个值,不会有问题
$class1 = ['张三', '李四', '王五', '赵六'];
array_splice($class1, 1,0,'李雷');//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
print_r($class1);
image.png
上面李雷前面是0,所以是添加,如果是1的话,就是替换了。下面这里是1.所以李四被李雷替换了
$class1 = ['张三', '李四', '王五', '赵六'];
array_splice($class1, 1,1,'李雷');//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
print_r($class1);
image.png
下面李雷前面2.所以李四和王五被李雷替换了
$class1 = ['张三', '李四', '王五', '赵六'];
array_splice($class1, 1,2,'李雷');//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
print_r($class1);
image.png
如果只写索引,不写值的话:
相当于把 从 索引为1开始的值删掉了一个
$class1 = ['张三', '李四', '王五', '赵六'];
array_splice($class1, 1,1);//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
print_r($class1);
image.png
删除元素
array_pop(arr);每次只能删除数组后面的 一个 元素
$class1 = ['张三', '李四', '王五', '赵六'];
array_pop($class1);//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
print_r($class1);
image.png
array_pop();可以接收到被删除的返回值:
输出返回值 Output Return
$class1 = ['张三', '李四', '王五', '赵六'];
$stu = array_pop($class1);//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
// print_r($class1);
print_r($stu);
image.png
删除列表的第一个值:
array_shift(arr);
$class1 = ['张三', '李四', '王五', '赵六'];
$stu = array_shift($class1);
print_r($stu);
print_r($class1);
print_r($stu); 返回值:
张三
print_r($class1);返回值:
列表第一项 张三 已被删除
Array ( [0] => 李四 [1] => 王五 [2] => 赵六 )
unset($variable); //删除变量(不能删除对象和资源)
unset() 销毁指定的变量或数组的一个值。
unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。
如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
如果想在函数中 unset() 一个全局变量,可使用 $GLOBALS 数组来实现
数组后面跟索引的删除法:
这样只会删除第0个索引的值
$class1 = ['张三','李四','王五','赵六'];
unset($class1[0]);//销毁数组的第一个值,但是这个值的索引还是在,剩下的索引不会按顺序重排
print_r($class1);
image.png
这个列表用其他的办法操作的话,索引会按顺序重排,但是用unset();的话,索引不会重排。
直接写数组的删除法:
这样会删除整个列表
$class1 = ['张三','李四','王五','赵六'];
unset($class1);//销毁数组的第一个值,但是这个值的索引还是在,剩下的索引不会按顺序重排
print_r($class1);
image.png
这样取最后一个值不会删掉他,而array_pop()函数会删掉最后一个元素,并返回这个被删掉的值
$class1 = ['张三', '李四', '王五', '赵六'];
$stu = $class1[count($class1)-1];
//取这个列表最后一个值的下标,count是取这个列表的长度,长度是从1开始算的.
//索引,也就是下标是从0开始算的,所以长度-1就正好和最后一个值的索引值相等.
//把它放在中括号里,就等于取class1的最后一个元素的索引了.
print_r($stu);
返回值:
返回值是列表的值,不是索引
赵六
获取列表最后一个值的函数:
end();
$stu = end($class1);
$class1 = ['张三', '李四', '王五', '赵六'];
$stu = end($class1);
print_r($stu);
返回值:
赵六
查:
$stu1 = ['张三','北京',20];
$stu2 = ['李四','上海',30];
$stu3 = ['王五','广州',18];
$stu4 = ['赵六','深圳',22];
$class1 = [$stu1,$stu2,$stu3,$stu4];
echo '<pre>';//<pre>格式化输出
print_r($class1);
echo '</pre>';
返回值:
image.png
在上面这个列表中取出上海的写法:
$stu1 = ['张三','北京',20];
$stu2 = ['李四','上海',30];
$stu3 = ['王五','广州',18];
$stu4 = ['赵六','深圳',22];
$class1 = [$stu1,$stu2,$stu3,$stu4];
echo '<pre>';//<pre>格式化输出
print_r($class1[1][1]);
//这里的索引第一个[1]是大列表的索引,第二个[1]是小列表的索引
//需要取的值外面套了几层列表,就要写几个中括号,中括号里写对应的索引值
echo '</pre>';
image.png
数组层数太多的情况下,用索引值取值也很麻烦,就可以给数组取一个名:
$class1 = [['张三','北京',20],['李四','上海',30],['王五','广州',['天河区'],18],['赵六','深圳',22]];
echo '<pre>';//<pre>格式化输出
print_r($class1[2][2][0]);
echo '</pre>';
$class1 = [['张三','北京',20],['李四','上海',30],'address'=>['王五','广州',['天河区'],18],['赵六','深圳',22]];
echo '<pre>';//<pre>格式化输出
print_r($class1['address'][2][0]);
echo '</pre>';
两种写法都是正确的,返回值都是天河区:
image.png
像上面这样的数组,如果数组中的值顺序错了,那么取出来的值也是错的,必须先排好值的顺序,按以下方法写就可以不用排序,顺序错了都能取出来:
$class1 = [
['name'=>'张三','address'=>'北京','age'=>20],
['name'=>'李四','address'=>'上海','age'=>30],
['name'=>'王五','address'=>'广州','age'=>18],
['name'=>'赵六','address'=>'深圳','age'=>22]
];
echo '<pre>';//<pre>格式化输出
print_r($class1[2]['age']);
echo '</pre>';
image.png
像上面这样,下标全是字符串的数组叫做关联数组
数组的分类:
根据中括号的层数分:
一层:一维数组
两层:二维数组
多层:多维数组
实际开发中,二维数组是用的最多的
根据下标来分:
索引数组:纯数字下标
关联数组:字符串下标
查询数组中有没有某一个下标,如果有就输出这个下标,没有就添加
如果有这个索引,输出这个下标对应值:
$class1 = ['name'=>'张三','address'=>'北京','age'=>20];
//查询数组中有没有下标,有就输出下标名字,没有就加一个下标
//array_key_exists(key, search); key是下标名称,search是数组名
if(array_key_exists('name', $class1)){
//如果有名称就输出
echo $class1['name'];
}else{//如果没有名称就加一个名称
$class1['name'] = '李雷';
print_r($class1);
}
image.png
如果没有这个索引,添加这个值后输出数组:
$class1 = ['name111111111'=>'张三','address'=>'北京','age'=>20];
//查询数组中有没有下标,有就输出下标名字,没有就加一个下标
//array_key_exists(key, search); key是下标名称,search是数组名
if(array_key_exists('name', $class1)){
//如果有名称就输出
echo $class1['name'];
}else{//如果没有名称就加一个名称
$class1['name'] = '李雷';
print_r($class1);
}
image.png
查询数组中有没有某一个值(上面是查索引,这里是查值)
$class1 = ['name'=>'张三','address'=>'北京','age'=>20];
//查询数组中有没有下标,有就输出值,没有就加一个值
//in_array(needle, haystack); needle针,haystack大海,大海捞针
//返回值:如果找到 needle 则返回 TRUE,否则返回 FALSE。
var_dump(in_array('王五', $class1));
返回值:
image.png
查询数组中有没有某一个值,如果有就修改他的名字
array_search 在数组中搜索给定的值,如果成功则返回首个相应的键名
首先先返回:
$class1 = ['name'=>'张三','address'=>'北京','age'=>20];
//查询数组中有没有王五,有就修改他的名字
//in_array(needle, haystack); needle针,haystack大海,大海捞针
//返回值:如果找到 needle 则返回 TRUE,否则返回 FALSE。
$name = '王五';
if(in_array($name, $class1)){
$key = array_search($name, $class1);//查询$name在数组$class1中的下标
$class1[$key] = '老王';
print_r($class1);
}else{
echo '没有王五';
}
image.png
网友评论