一、数组概述
1.1 数组是复合类型
1.2 数组中可以存储任意长度的数据, 也可以存储任意类型的数据
二、数组的类型
2.1 索引数组: 下标是顺序整数作为索引
<?php
$user[0] = 1;
$user[1] = "zhangsan";
$user[2] = "aaa@bb.com";
echo '<pre>';
print_r($user);
echo '</pre>';
?>
2.2 关联数组: 下标是字符串作为索引
<?php
$user["id"] = 1;
$user["name"] = "zhangsan";
$user["email"] = "aaa@bb.com";
echo '<pre>';
print_r($user);
echo '</pre>';
$user["name"] = "lisi";
echo $user["name"];
?>
三、数组的多种声明方式
3.1 直接为数组元素赋值
a. 如果索引下标不给值,就会从0开始顺序索引
b. 如果给出索引下标,下一个就会是从最大的开始增1
c. 如果后面出现前面的下标,如果是赋值就是为前面的元素重新赋值
d. 混合声明时,索引和关联不互相影响(不影响索引下标的声明)
3.2 使用array()函数
a. 默认是索引数组
b. 如果为关联数组和索引数组指定下标,使用 键=>值
c. 多个成员之前使用“,”分割
<?php
$user1 = array (1, "zhsangsan", 10, "nan", "aaa@bbb.com");
echo '<pre>';
print_r($user1);
echo '</pre>';
/**
Array(
[0] => 1
[1] => zhsangsan
[2] => 10
[3] => nan
[4] => aaa@bbb.com
)
*/
$user2 = array("id"=>1, "name"=>"zhsangsan", "age"=>10, 100=>"nan", "aaa@bbb.com");
echo '<pre>';
print_r($user2);
echo '</pre>';
/**
Array(
[id] => 1
[name] => zhsangsan
[age] => 10
[100] => nan
[101] => aaa@bbb.com
)
*/
?>
重要知识点: 二维数组
<?php
$info=array(
"user"=>array(
array(1, "zansan", 10, "nan"),
array(2, "lisi", 20, "nv")
)
);
echo $info["user"][1][1]; // lisi
echo '<pre>';
print_r($info);
echo '</pre>';
/**
Array
(
[user] => Array
(
[0] => Array
(
[0] => 1
[1] => zansan
[2] => 10
[3] => nan
)
[1] => Array
(
[0] => 2
[1] => lisi
[2] => 20
[3] => nv
)
)
)
*/
?>
四、数组的遍历
4.1 使用for语句循环遍历(不推荐)
局限性: 数组必须是索引数组, 而且下标必须是连续的 (然而索引数组下标可以不连续, 数组还可能是关联数组)
<?php
$user = array(1, "zhasna", "aaa@bb.com");
for($i = 0; $i < count($user); $i++){
echo "\$user[{$i}]=".$user[$i]."<br>";
}
/**
$user[0]=1
$user[1]=zhasna
$user[2]=aaa@bb.com
*/
?>
4.2 使用foreach语句循环遍历(强烈推荐)
循环次数由数组的元素个数决定, 每一次循环都会将数组中的元素分别赋值给后面的变量
<?php
$user=array(1, "name"=>"zhasna", "age"=>40, 100=>"nan", "aaa@bb.com");
foreach($user as $key => $val){ // $var 是自定义变量, $key自定义变量
echo $key." =====> ".$val."<br>";
}
/*
0 =====> 1
name =====> zhasna
age =====> 40
100 =====> nan
101 =====> aaa@bb.com
*/
foreach($user as $val){ // 不要key也可以, 直接遍历$user的值
echo $val."<br>";
}
/*
1
zhasna
40
nan
aaa@bb.com
*/
?>
4.3 使用while(), list(), each() 组合循环遍历(不推荐)
each() 函数:
* 需要一个数组作为参数
* 返回来的也是一个数组
* 返回来的数组时0, 1, key, value四个下标, 0和key下标是当前数组元素的键, 1和value下标是当前数组元素的值
* 默认当前元素就是第一个元素
* 每执行一次后就会将当前元素向后移动
* 如果已经到了最后还执行这个函数, 则返回false
<?php
$user = array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");
while($arr = each($user)){
// echo $arr[0]."==>".$arr[1]."<br>";
echo $arr["key"]." ----> ".$arr["value"]."<br>";
}
/**
id ----> 1
name ----> zhangsan
age ----> 10
sex ----> nan
*/
?>
list() 函数:
* list()=array(); 需要将一个数组赋值给这个函数
* 数组中的元素个数要和list()函数中的参数个数相同
* 数组中的每个元素值会赋值给list()函数中的每个参数,list()将每个参数转为变量
* list()只能接收索引数组
<?php
list($name, $age, $sex) = array("zansan", 10, "nnnnn");
echo $name."<br>";
echo $age."<br>"; // list中的值和数组中的值一一对应
echo $sex."<br>"; // 如果不想给name赋值, 那就写成list(, $age, $sex)
/*
zansan
10
nnnnn
*/
$user1 = array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");
list($key, $value) = each($user1); // Array ( [1] => 1 [0] => id )
echo $key." --> ".$value;
/*
id --> 1
*/
$user2 = array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");
while(list($key, $value) = each($user2)){
echo $key." ==> ".$value."<br>";
}
/*
name ==> zhangsan
age ==> 10
sex ==> nan
*/
?>
五、预定义数组
自动全局变量 -- 超全局数组
1. 包含了来自WEB服务器,客户端,运行环境和用户输入的数据
2. 预定义数组在全局范围内自动生效,例如在函数中不用声明global也可以使用这些数组
3. 用户不能自定义这些数组, 但这些数据操作方式又和我们自定义的数组操作方式一样
* $_GET // 经由URL请求提交至脚本的变量
* $_POST // 经由HTTP POST方法提交到脚本的变量
* $_REQUEST // 经由GET, POST和COOKIE机制提交到脚本的变量,因此该数组并不值得信任,尽量不去使用
* $_FILES // 经由HTTP POST 文件上传而提交至脚本的变量
* $_COOKIE //
* $_SESSION //
* $_ENV // 执行环境提交至脚本的变量
* $_SERVER // 变量由WEB服务器设定的,或直接和当前脚本的执行环境相关联
* $GLOBALS // 只要是当前脚本有效的变量都在这里,数组键名为全局变量的名称
<?php
print_r($_GET);
echo $_GET["username"]."<br>"; // 获取get方式url中的username
print_r($_POST);
echo $_POST["uname"]."<br>"; // 获取post方式表单提交的uname
print_r($_REQUEST);
echo $_ENV["OS"]."<br>"; // 获取key为'OS'的value
echo $_SERVER["DOCUMENT_ROOT"]."<br>"; // 获取key为'DOCUMENT_ROOT'的value
$a = 100; // 定义的变量会存到$GLOBALS中
function demo(){
echo $GLOBALS["a"]."<br>"; // 无需声明global就可以直接取值
}
demo();
?>
<form action="demo.php" method="post"> <!-- post方式提交数据, 数据会存到$_POST中 -->
username: <input type="text" name="uname"><br>
password: <input type="password" name="pass"><br>
<input type="submit" value="login"> <br>
</form>
<a href="demo.php?username=zhangsan">this is a $_GET test</a> <!-- get方式提交数据, 数据会存到$_GET中 -->
六、数组相关函数
1. 数组键/值操作有关的函数
* 1.1 array_values() 返回 input
数组中所有的值并给其建立数字索引
<?php
$array = array (
"size" => "XL",
"color" => "gold"
);
print_r(array_values($array));
/*
Array
(
[0] => XL
[1] => gold
)
*/
?>
* 1.2 array_keys() 返回数组中所有的键名
<?php
$array = array (
0 => 100,
"color" => "red"
);
print_r(array_keys($array));
/*
Array(
[0] => 0
[1] => color
)
*/
?>
* 1.3 in_array() 检查数组中是否存在某个值
<?php
$os = array ("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Got Irix";
}
if (in_array("mac", $os)) {
echo "Got mac";
}
?>
* 1.4 array_key_exists 当给定的key
存在于数组中时返回TRUE
<?php
$search_array = array (
'first' => 1,
'second' => 4
);
if (array_key_exists('first', $search_array)) {
echo "The 'first' element is in the array";
}
?>
* 1.5 array_flip 交换数组中的键和值
<?php
$trans = array (
"a" => 1,
"b" => 1,
"c" => 2
);
$trans = array_flip($trans);
print_r($trans); // Array ( [1] => b [2] => c )
// 如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了
?>
* 1.
6 array_reverse 返回一个单元顺序相反的数组
<?php
$input = array (
"php",
4.0,
array (
"green",
"red"
)
);
$result = array_reverse($input);
print_r($result);
// Array ( [0] => Array ( [0] => green [1] => red ) [1] => 4 [2] => php )
?>
2. 统计数组元素的个数和惟一性
* 2. 1 count() sizeof();
<?php
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count($a);
print_r($result); // 3
?>
* 2.
2 array_count_values 统计数组中所有的值出现的次数
<?php
$array = array (
1,
"hello",
1,
"world",
"hello"
);
echo "<pre>";
print_r(array_count_values($array));
echo "</pre>";
/*
Array
(
[1] => 2
[hello] => 2
[world] => 1
)
*/
* 2.
3 array_unique 移除数组中重复的值
<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique ($input);
echo "<pre>";
print_r($result);
echo "</pre>";
/*
Array
(
[a] => green
[0] => red
[1] => blue
)
*/
?>
3. 使用回调函数处理数组的函数* 3.1 array_filter() 用回调函数过滤数组中的单元
<?php
function odd($var) {
// returns whether the input integer is odd
return ($var & 1);
}
$array = array (
"a" => 1,
"b" => 2,
"c" => 3
);
echo "<pre>";
print_r(array_filter($array, "odd"));
echo "</pre>";
/*
Array
(
[a] => 1
[c] => 3
)
*/
?>
* 3.2 array_walk() 使用用户自定义函数对数组中的每个元素做回调处理
<?php
$fruits = array (
"d" => "lemon",
"a" => "orange",
"b" => "banana",
"c" => "apple"
);
// funcname 接受两个参数。array参数的值作为第一个,键名作为第二个。
function test_print($item, $key) {
echo " $key => $item <br />\n";
}
array_walk($fruits, 'test_print');
/*
d => lemon
a => orange
b => banana
c => apple
*/
?>
* 3.3 array_map() 将回调函数作用到给定数组的单元上
<?php
function cube($n){
return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map ("cube", $a);
print_r($b);
// Array ([0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125)
?>
4. 数组的排序函数
* 4.1 sort() rsort() 简单的数组排序
<?php
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "<br>";
}
/*
fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange
*/
?>
* 4.2
ksort() krsort() 根据键名对数组排序
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
ksort($fruits);
foreach ($fruits as $key => $val){
echo "$key = $val <br>";
}
/*
a = orange
b = banana
c = apple
d = lemon
*/
?>
* 4.3
asort() arsort() 根据元素的值对数组排序
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val){
echo "$key = $val <br>";
}
/*
c = apple
b = banana
d = lemon
a = orange
*/
?>
* 4.4
natsort() natcasesort() 根据“自然数排序”法对数组排序
<?php
$array = array("img12.png", "img10.png", "img2.png", "img1.png");
asort($array);
echo "<pre>";
print_r($array);
echo "</pre>";
/*
Array
(
[3] => img1.png
[1] => img10.png
[0] => img12.png
[2] => img2.png
)
*/
?>
* 4.5
usort() uasort() uksort() 根据用户自定义规则对数组排序
<?php
function cmp($a, $b){
if($a == $b){
return 0;
}
return ($a < $b) ? - 1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a , "cmp");
foreach ($a as $key => $value) {
echo "$key : $value <br>" ;
}
/*
0 : 1
1 : 2
2 : 3
3 : 5
4 : 6
*/
?>
* 4.6
array_multisort 一次对多个数组进行排序
5. 拆分、合并、分解、接合的数组函数
* 5.1 array_slice() 从数组中取出一段
* 5.2 array_splice() 把数组中的一部分去掉并用其它值取代
* 5.3 array_combine() 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
* 5.4 array_merge() 合并一个或多个数组
* 5.5 array_intersect() 计算数组的交集
* 5.6 array_diff() 计算数组的差集
6. 数组与数据结构的函数
* 6.1 array_push() array_pop() 使用数据实现堆栈
* 6.2 array_unshift() array_shift() unset() 使用队列
7. 其它与数据操作有关的函数
* 7.1 array_rand() 从数组中随机取出一个或多个单元
* 7.2 shuffle() 将数组打乱
* 7.3 array_sum() 计算数组中所有值的和
* 7.4 range() 建立一个包含指定范围单元的数组