PHP数组与数据结构
数组是把若干变量按有序的形式组织起来的一种形式。
这些数据元素的集
数组分为一维二维三维、索引数组(数组索引是整数)和关联数组
(1)数组的声明
1、一个数组中存的多个内容、数组中的内容叫作“元素”
2、每个元素都是由健和值组成的Key/value
$a=array(“one”=>”111”,”two”=>”2222”);
3、下标有二种类型:一种是整数(索引数组)、一种是字符串(关联数组)
4、[]和{}来操作下标
5、在使用下标时、如果是关联数组、一定要使用引号、不要使用常量名称(各种类型都可以作下标、但会强制转换)
6、数组的自动增涨下标、默认从0开始、出现最大值加1
7、关联数组的字符串下标、不影响索引下标的排列规则
8、使用array()函数声明数组、默认索引下标从0开始
9、使用=>符号指定下标
Php5.4以后可以像其他语言一样声明数组$arr=[“a”,”bb”];
10、删除数组中的一个元素使用unset(但不会重建索引)删除后重建用array_values()函数
二维数组(数组的数组)三维数组 $group=array(array(“1”,”2”), array(“1”,”2”),)
(2)for循环遍历数组
当数组下标不是连续的时候、For循环遍历不了数组
$arr=array(“aa”,”bb”,”cc”);
For($i=0;$i<count($arr);$i++){
Echo$arr[$i].”<br>”;
}
(3)foreach循环遍历
数组有多少个元素、foreach就循环多少次
Foreach(数组 as自定义变理){
}
Foreach(数组 as 下标变理(键)=>自定义变理(值)){
}
$arr=array(“11”,”bb”);
Foreach($arras $key => $values){
Echo “{$key}====>{$values}”
}
$arr= array(
array("name"=>"ssw","age"=>22, "性别"=>"sex"),
array("name"=>"ssw1","age"=>29, "性别"=>"six"),
array("name"=>"ssw2","age"=>26, "性别"=>"sex")
);
echo"<table border=‘1‘ width=‘200‘>";
echo"<caption>数组转为表格</caption>";
foreach($arras $row){
echo "<tr>";
foreach($row as $col){
echo"<td>".$col."</td>";
}
echo "</tr>";
}
echo"</table>";
(4)联合使用list() each() while()循环遍历使用
List()作用:
1、等号左边用list()函数、等号右边只能是一个数组
2、数组中有几个元素、在list()中就用几个参数、而且参数必须是变量、不能是值
3、只能将索引数组(下标是连续)、转为变理、是按下标0开始找的
4、可以在list()参数中通过、空项选择性接收数组中的元素
$str=”天涯_海角”;
List($name,$sea)=explode(“_”,$str);
Echo $name;
Echo $sea;
天涯
海角
Each()是一个函数、参数为数组、返回值也是一个数组
1、返回值是一个数组、数组有4个固定元素、下标固定的1 值 value值 0 下标key下标
2、each()只处理当前元素、将当前元素转为数组信息、处理完后、指针向下一个元素移动
3、如果指定已经结束了、在使用each()获取元素、返回false
$arr =array("one"=>"Thinkphp","two"=>"Yii", "three"=>"smarty");
while(list($key,$val) = each($arr)){
echo"{$key}=>{$val}<br>";
}
显示:
one=>Thinkphp
two=>Yii
three=>smarty
(5)数组内部指针遍历数组
控制指定的位置next(下一个) prev(上一个) end(最后一个) reset(第一个)
Key()获取数组当前下标 current()获取数组当前值
$arr =array("one"=>"Thinkphp","two"=>"Yii", "three"=>"smarty");
Echo “当前位置:” . ”key($arr)”. ”==>” . ”current($arr)” . ”<br>”;
(6)php超全局数组
超全局数组(变量)在系统中已预定好的、可以直接调用
$_SERVER 服务器变量
$_ENV 环境变量
$_GET http get变量 接收用户通过url向服务器传的参数
$_POST http post变量 接收用户通过http协议向服务器传的参数
$_REQUEST request变量 此关联数组包含$_GET $_POST$_COOKIE中全部内容
$_FILES http文件上传变量
$_COOKIE http cookies
$_SESSION session变量
$_GLOBALS global变量
Print_r($_SERVER);
(7)PHP常用数组函数
数组的键值操作函数(函数主要看功能 返回值)
Array_values()返回数组中所有的值,返回数组。
$sh=array(“shang”=>”上海”,”海”=>”海南”);
Print_r(Array_values($sh));
显示为:Array ( [0] => ”上海” [1] => ”海南” )
Array_keys(array,value,strict)返回数组中所有的键,返回数组。
Array为数组 value可选指定键值、然后只有该键值对应的键名被返回
Strict 可选 true 依赖类型 faLse不依赖类型
<?php
$a=array(10,20,30,"10");
print_r(array_keys($a,"10",true));
?>
显示为:Array ( [0] => 3 )
In_array(search, array,type)搜索数组中是否存在指定的值,返回真假。
Search 必需、规定要在数组搜索的值
Array 必需、规定要搜索的数组
Type 可选、设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
$sh=array(“shang”=>”上海”,”海”=>”海南”);
If(in_array(“上海”, $sh)){
Echo“在数组中”
}else{
Echo“不在数组中”:
}
显示:在数组中
array_search(search,array, type)函数在数组中搜索某个键值,并返回对应的键名,如果没找到,则返回 false
Search 必需、规定要在数组搜索的值
Array 必需、规定要搜索的数组
Type 可选、设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
$a=array("a"=>"5","b"=>5,"c"=>"5");
echoarray_search(5,$a,true);
显示:b
Array_key_exists(search, array, type)搜索数组中是否存在指定的键,返回真假。
Search 必需、规定要在数组搜索的值
Array 必需、规定要搜索的数组
Type 可选、设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
$a=array("a"=>"5","b"=>5,"kong"=>null);
If(array_key_exists(“kong”, $a)){
Echo“在数组中”
}else{
Echo“不在数组中”:
}
显示:在数组中
Array_flip(array)交换数组中所有的键名以及它们关联的键值、返回数组(只能处理整数和字符串)
$a=array("a"=>"5","b"=>5,"c"=>"cisoco");
print_r(array_flip($a));
显示:Array ( [5] => b [cisoco] => c ) //重复下标会被后面相同键名的覆盖
Array_reverse(array,preserve)将原数组中的元素顺序翻转,创建新的数组并返回
Array 必需、规定数组
Preserve可选(true/false)规定是否保留原始数组的键名
$a=array("a","b","c");
$reverse=array_reverse($a);
$preserve=array_reverse($a,true);
print_r($a);
echo"<br>";
print_r($reverse);
echo"<br>";
print_r($preserve);
显示为:
Array( [0] => a [1] => b [2] => c )
Array ( [0] => c [1] => b [2] => a )
Array ( [2] => c [1] => b [0] => a )
统计数组元素的个数与唯一性
Count(array,mode)返回数组中元素的数目(strlen是统计字符串长度)
Array 必需、规定数组
Mode 可选、0为不对多维数组统计、1递归统计数组中的元素
$cars=array
(
"Volvo"=>array( "XC60", "XC90"),
"BMW"=>array("X3","X5"),
"Toyota"=>array("Highlander")
);
echo "常规计数:" .count($cars)."<br>";
echo "递归计数:" .count($cars,1);
显示为:
常规计数:3
递归计数:8
Array_count_values(array)统计数组中所有值出现的次数、返回一个数组
$a=array("A","Cat","Dog","A","Dog");
print_r(array_count_values($a));
显示为:
Array ( [A] => 2 [Cat] => 1 [Dog] => 2 )
Array_unique(array)移除数组中的重复的值,并返回结果数组
当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除
$a=array("a"=>"red","b"=>"green","c"=>"red");
print_r(array_unique($a));
显示为:Array ( [a] => red [b] => green )
使用回调函数处理数组的函数
Array_filter(array,callbackfunction);用回调函数过滤数组中的值、返回原数组
Callbackfunction 必需 规定要使用的回调函数
$arr = array(1,3,4,false,-2,-1,-6,null,-8);
var_dump(array_filter($arr));
echo "<br>";
function myfun($value){
if($value>= 0)
returntrue;
else
returnfalse;
}
var_dump(array_filter($arr,"myfun"));
var_dump(array_filter($arr,function($value){
return!($value%2==0);
}));
显示为:
array(7){ [0]=> int(1) [1]=> int(3) [2]=> int(4) [4]=> int(-2) [5]=>int(-1) [6]=> int(-6) [8]=> int(-8) }
array(5) { [0]=> int(1) [1]=> int(3) [2]=> int(4) [3]=> bool(false)[7]=> NULL }
array_walk(array,myfunction, userdata)对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数
array必需。规定数组。
myfunction必需。用户自定义函数的名称。
Userdata可选。规定用户自定义函数的参数
事例一:
$arr = array(1,2,3,4,5);
function myfun(&$value){
$value=$value*$value;
}
print_r($arr);
echo "<br>";
array_walk($arr,"myfun");
print_r($arr);
显示为:
Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
事例二:
$_arr = array(22,44,66,76,43,24);
array_walk($_arr, function($value,$key){
var_dump($value, $key);
echo"<br>";
});
显示:int(22) int(0)
int(44) int(1)
int(66) int(2)
int(76) int(3)
int(43) int(4)
int(24) int(5)
事例三:
$arr =array("one"=>1,"two"=>2,"three"=>3,"four"=>4,"five"=>5);
function myfun($key,$value){
echo"{$key}===={$value}<br>";
}
array_walk($arr,"myfun");
显示为:
1====one
2====two
3====three
4====four
5====five
事例四:
$arr =array("one"=>1,"two"=>2,"three"=>3,"four"=>4,"five"=>5);
array_walk($arr, function($v,$k,$str){
echo"{$k} {$str} {$v}<br>";
}, "++++");
print_r($arr);
echo "<br>";
显示为:
1++++one
2++++two
3++++three
4++++four
5++++five
Array_map(callback,$array1,$array2)将回调函数作用到给定数组的单元上、返回一个数组。
callback 回调函数
array 为数组
$arr=array(1,2,3,4);
$brr=array("one","two");
function myfun($v,$bv){
echo" $v --- $bv <br>";
return1;
}
$rarr = array_map("myfun",$arr,$brr);
print_r($rarr);
显示为:
1--- one
2 --- two
3 ---
4 ---
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 )
$arr=array(1,2,3);
$brr=array("one","two");
$rarr = array_map(null,$arr,$brr);
echo "<pre>";
print_r($rarr);
echo "</pre>";
显示为:
Array
(
[0] => Array
(
[0] => 1
[1] => one
)
[1] => Array
(
[0] => 2
[1] => two
)
[2] => Array
(
[0] => 3
[1] =>
)
)
数组的排序函数
1、冒泡法进行排序实例
代码:
<?php
/**
* PHP中的冒泡排序法使用
*/
// 预先声明一个数组
$arr= array(12,45,28,30,88,67);
echo"原数组";
print_r($arr);
echo"<br/>";
//冒泡排序
functionmaopao($arr){
// 进行第一层遍历
for($i=0,$k=count($arr);$i<$k;$i++) {
// 进行第二层遍历将数组中每一个元素都与外层元素比较
// 这里的i+1意思是外层遍历当前元素往后的
for($j=$i+1;$j<$k;$j++) {
// 内外层两个数比较
if($arr[$i]<$arr[$j]){
// 先把其中一个数组赋值给临时变量
$temp= $arr[$j];
// 交换位置
$arr[$j] = $arr[$i];
// 再从临时变量中赋值回来
$arr[$i] = $temp;
}
}
}
// 返回排序后的数组
return$arr;
}
// 直接打印排序后的数组
echo‘排序后‘;
print_r(maopao($arr));
2、二分法进行排序实例
$arr = array(20,18,12,9,45,34,28,22,99);
function qsort($arr){
if(!is_array($arr)|| empty($arr))
returnarray();
//获取数组的长度
$len= count($arr);
//如果数组中只有一个元素、直接返回这个数组
if($len<= 1)
return$arr;
$key[0]= $arr[0];
$left= array();
$right= array();
for($i=1;$i<$len;$i++){
if($arr[$i]<= $key[0]){
$left[]=$arr[$i];
}else{
$right[]= $arr[$i];
}
}
$left=qsort($left);
$right=qsort($right);
returnarray_merge($left,$key,$right);
}
print_r($arr);
echo "<br>";
print_r(qsort($arr));
显示:
Array( [0] => 20 [1] => 18 [2] => 12 [3] => 9 [4] => 45 [5] => 34[6] => 28 [7] => 22 [8] => 99 )
Array ( [0] => 9 [1] => 12 [2] => 18 [3] => 20 [4] => 22 [5]=> 28 [6] => 34 [7] => 45 [8] => 99 )
3、数组排序系统函数
Sort() 对数组进行升序排序、排列后数组被赋予新的键名、成功返加true、失败false
Rsort() 对数组进行降序排序、排列后数组被赋予新的键名、成功返加true、失败false
$arr = array(20,18,12,9,45,);
sort($arr);
print_r($arr);
显示为:
Array( [0] => 9 [1] => 12 [2] => 18 [3] => 20 [4] => 45 )
Ksort() 对数组按照键名排序、成功,返回 TRUE,否则返回 FALSE。
Krsort()对数组按照键名逆向排序、成功,返回 TRUE,否则返回 FALSE。
Asort() 对数组进行排序并保持索引关系、、成功,返回 TRUE、失败 FALSE
Arsort() 对数组进行逆向排序并保持索引关系、、成功,返回 TRUE、失败 FALSE
Natsort() 用自然顺序算法对给定数组中的元素排序、保留原始的键名、成功,返回 TRUE、失败 FALSE
Natcasesort()用自然顺序算法对给定数组中的元素排序、不区分大小写、保留原始的键名、成功,返回 TRUE、失败 FALSE
Usort() 使用用户自定义的比较函数对数组中的值进行排序、成功,返回 TRUE、失败 FALSE
Uasort()使用用户自定义的比较函数对数组中的值进行排序并保持索引关系、成功,返回 TRUE、失败 FALSE
Uksort()使用用户自定义的比较函数对数组中的键进行排序、成功,返回 TRUE、失败 FALSE
$data = array("FILE32.TXT","file.txt","file11.txt");
usort($arr, function($a,$b){
$alen= strlen($a);
$blen= strlen($b);
if($alen> $blen){
return1;
}elseif($alen< $blen){
return-1;
}else{
return0;
}
});
print_r($arr);
Array_multisort()对多个数组或多维数组进行排序、成功,返回 TRUE、失败 FALSE
$data = array(
array("id"=>1,"name"=>"aa", "age"=>10),
array("id"=>2,"name"=>"ww", "age"=>30),
array("id"=>3,"name"=>"cc", "age"=>30),
array("id"=>4,"name"=>"dd", "age"=>40),
);
$ages = array();
$names = array();
foreach($data as $value){
$ages[]= $value["age"];
$names[]= $value["name"];
}
array_multisort($ages,SORT_DESC,$name,SORT_DESC,$data);
echo "<pre>";
print_r($data);
echo "</pre>";
显示为:
Array
(
[0]=> Array
(
[id] => 1
[name] => aa
[age] => 10
)
[1]=> Array
(
[id] => 2
[name] => ww
[age] => 30
)
[2]=> Array
(
[id] => 3
[name] => cc
[age] => 30
)
[3]=> Array
(
[id] => 4
[name] => dd
[age] => 40
)
)
拆分、合并、分解与结合数组
Array_slice(array,start,length,preserve)在数组中根据条件取出一段值,并返回数组
Array 必需、数组
Start 必需、开始、0第一个元素
Length 可选、取数组的长度
Preserve 可选、true保留键名、false重置键名
$data =array("a","b","c","d","e");
$arr = array_slice($data,-3,2,true);
print_r($arr);
显示为:Array ( [2] => c [3]=> d )
array_splice(array,start,length,array)从数组中移除元素,并用新元素取代它,该函数也将返回包含被移除元素的数组
Array 必需、数组
Start 必需、开始、0第一个元素
Length 可选、取数组的长度
Array 插入数组
$data =array("a","b","c","d","e");
$arr =array_splice($data,-3,2,array("hhhh","wwww"));
print_r($arr); //该函数也将返回包含被移除元素的数组
echo "<br>";
print_r($data);
显示为:
Array( [0] => c [1] => d )
Array ( [0] => a [1] => b [2] => hhhh [3] => wwww [4] => e )
Array_combine (keys,values);通过合并两个数组来创建一个新数组,其中的一个数组是键名,另一个数组的值为键值、键名数组和键值数组的元素个数必须相同、不同返回false
Keys必需。键名数组
Values必需。键值数组。
$key =array("a","b","c","d","e");
$value = array(11,22,33,44,55);
$all = array_combine($key,$value);
print_r($all);
显示为:
Array( [a] => 11 [b] => 22 [c] => 33 [d] => 44 [e] => 55 )
Array_merge(array1,array2,array3...)把一个或多个数组合并为一个数组如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素果您仅向函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引
$a =array("a","one"=>"b","c");
$b = array(10,"one"=>11,12);
$c = array_merge($a , $b);
print_r($c);
显示为: //下标相同的会覆盖、是前面的覆盖后面的
Array( [0] => a [one] => 11 [1] => c [2] => 10 [3] => 12 )
$a =array("a",5=>"b","c"); //只输入一个数组
$c = array_merge($a);
print_r($c);
显示为:Array ( [0] => a [1]=> b [2] => c )
Array_intersect()计算数组的交集、返回数组的键名保留不变
Array_diff()计算数组差集、返回的数组中,键名保持不变
桟和队列
桟:先进后出(子弹夹)
入栈:array_push,在桟尾放入元素!
出栈:array_pop,在桟尾删除元素
队列,先进先出
入队列:array_push()在数组的尾端将数据压入数组
出队列:array_shift();在数组的顶端,将数据取出
array_unshift()可以将数据由数组的顶端压入数组!
事例:
$a=array("a"=>"red","b"=>"green");
array_push($a,"blue","yellow");
print_r($a);
array_pop($a);
echo "<br>";
print_r($a);)
显示为:
Array( [a] => red [b] => green [0] => blue [1] => yellow )
Array ( [a] => red [b] => green [0] => blue )
事例:
$a=array("a"=>"red","b"=>"green","c"=>"blue");
echoarray_shift($a);
echo"<br>";
print_r ($a);
显示为:
red
Array ( [b] => green [c] => blue )
事例:
$a=array("a"=>"red","b"=>"green");
array_unshift($a,"blue");
print_r($a);
显示为:
Array ( [0] =>blue [a] => red [b] => green )
其他有用的数组处理函数
Array_rand (array,number)函数从数组中随机选出一个或多个元素,并返回键名的数组
Number可选。规定返回多少随机键名
$a =array("red","green","linux");
print_r(array_rand($a,1));
显示为:Array ( [0] => 0 [1]=> 2 )
Shuffle(array)把数组中的元素按随机顺序重新排序、返回bool型。该函数为数组中的元素分配新的键名。已有键名将被删除
$a =array("r"=>"red","g"=>"green","l"=>"linux");
shuffle($a);
print_r($a);
显示为:Array ( [0] => red [1]=> linux [2] => green )
Array_sum(array)计算数组中所有值的和
$a=array("a"=>5,"b"=>13);
echo array_sum($a);
显示为:18
Range (low,high,step)创建一个包含指定范围的元素的数组
Low必需。规定数组的最低值。
High必需。规定数组的最高值。
Step可选。规定元素之间的步进制。默认是 1。
$number= range(0,50,10);
print_r($number);
显示为:Array ( [0] => 0 [1] => 10 [2] => 20 [3]=> 30 [4] => 40 [5] => 50 )
Array_fill (index,number,value);用给定的值填充数组,返回的数组有 number个元素,值为 value
Index必需。被返回数组的第一个索引。
Number必需。规定要插入的元素数。
Value必需。规定供填充数组所使用的值。
$number = array_fill(3,4,"blue");
print_r ($number);
显示为:Array ( [3] => blue [4]=> blue [5] => blue [6] => blue )