<?php
//============================================================
//-----------------------数组指针-----------------------------
	$people = array("Bill", "Steve", "Mark", "David");

	echo current($people) . "<br>";	// 当前元素是 Bill
	echo next($people) . "<br>";		// Bill 的下一个元素是 Steve
	echo current($people) . "<br>";	// 现在当前元素是 Steve
	echo prev($people) . "<br>";		// Steve 的上一个元素是 Bill
	echo end($people) . "<br>";		// 最后一个元素是 David
	echo prev($people) . "<br>";		// David 之前的元素是 Mark
	echo current($people) . "<br>";	// 目前的当前元素是 Mark
	echo reset($people) . "<br>";	// 把内部指针移动到数组的首个元素,即 Bill
	echo next($people) . "<br>";		// Bill 的下一个元素是 Steve

	print_r (each($people));	// 返回当前元素的键名和键值(目前是 Steve),并向前移动内部指针
//==========================================================
//-----------------------转换为索引数组--------------------
	//传入数组返回索引数组
	$arr=array_values(array())
	//------------------------------------------------------
	//-------------------将数组值赋给变量------------------
	list($a,$b)=array("a","b");
	echo $a,$b;
	//------------------------------------------------------
	//-------------------返回数组的键名--------------------
	$arr=("a"=>"one","b"=>100,"c"=>"100");
	//返回数组所有键名
	$arr=array_keys($arr);
	/* Array ( [0] => a [1] => b [2] => c ) */
	//返回指定数组值的键名
	$arr=array_keys($arr,"one");	//返回 a
	//返回键名时严格按类型如 100 与 "100"
	$arr=array_keys($arr,"100",true);
	//------------------------------------------------------
	//-----------------判断键名是否在数组------------------
	$arr=array("one","two","three");
	if(in_array("one",$arr)){
		echo "exists";
	}else{
		echo "not exists";
	}
	//第三个参数:严格按类型判断
	in_array("one",$arr,true);
	//------------------------------------------------------
	//---------------判断数组中是否有该键名----------------
	//判断键名是否在数组中
	$arr = array("one"=>"111","two"=>"222");
	if(array_key_exists("one",$arr)){
		echo "ok";
	}
	//------------------------------------------------------
	//----------------交换数组中的键和值-------------------
	$arr=array("a"=>"one","b"=>"two","c"=>"three");
	$arr=array_flip($arr);
	/* Array ( [one] => a [two] => b [three] => c ) */
	//如果有两值相同则
	$arr=array("a"=>"one","b"=>"two","c"=>"two");
	$arr=array_flip($arr);
	/* Array ( [one] => a [two] => c ) */
	//------------------------------------------------------
	//----------------将数组元素顺序颠倒-------------------
	$arr=array("a"=>"one","b"=>"two","c"=>"three");
	$arr=array_reverse($arr);
	/* Array ( [c] => three [b] => two [a] => one ) */
	
//=======================统计数组相关======================
//----------------------统计数组元素-----------------------
	//统计数组元素
	count(); //别名sizeof();
	$arr=array("a"=>"one","b"=>"two",array(1,2,3,4,5,6));
	//默认统计第一纬的数组
	count($arr);
	//传入第二个参数时统计多维数组
	count($arr,1);
	//------------------------------------------------------
	//------------统计数组中各个值出现的次数--------------
	$arr=array("one","two","one","three");
	$arr=array_count_values($arr);
	/* Array ( [one] => 2 [two] => 1 [three] => 1 ) */
	//------------------------------------------------------
	//---------------移除数组中重复的值--------------------
	$arr=array("one","two","one","three");
	$arr=array_unique($arr);
	/* Array ( [0] => one [1] => two [3] => three ) */
	
//===================使用回调函数处理数组==================
//----------------------------------------------------------
	$arr=array(1,2,3,4,-5,6,-7,8,-9);
	//自定义回调函数
	$arr=array_filter($arr,"fun");
	//用此函数过滤掉负数
	function fun($n){
		if($n>0)
			return true;
		else
			return false;
	}
	/* Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [5] => 6 [7] => 8 )*/
	
	//用此函数取出偶数
	function fun1($n){
		if($n%2==0)
			return true;
		else
			return false;
	}
	/*Array ( [1] => 2 [3] => 4 [5] => 6 [7] => 8 )*/
	//------------------------------------------------------
	//---------对数组中的每个成员用回调函数处理-----------
	$arr=array("a"=>"one","b"=>"two","c"=>"three");
	//参数:数组,回调函数,任意值(可选)
	array_walk($arr,"fun","=>");
	//回调函数,第一个传值,第二个传键名
	function fun($value,$key){
		echo "key  ".$key."  value  ".$value."<br>";
	}
	//传入第三个值$p
	function fun($value,$key,$p){
		echo $key.$p.$value."<br>";
	}
	//输入应用
	array_walk($arr,"fun");
	function fun(&$value,$key){
		$value="hello";
	}
	print_r($arr);
	/*Array ( [a] => hello [b] => hello [c] => hello )*/
	//------------------------------------------------------
	//------------------------------------------------------
	$arr=array("a","b","c","d");
	/*依次将数组中的值都传入函数中,然后对每一个值进行处理后再返回*/
	$arr=array_map("fun",$arr);	//可传多个数组
	function fun($n){
		return "--".$n."--";
	}
	print_r($arr);
	//Array ( [0] => --a-- [1] => --b-- [2] => --c-- [3] => --d-- )
//=========================数组排序=========================
//--------------------按键值对数组进行排序-----------------
	//从小到大排序
	$arr=array(5,6,8,2,4);
	//直接将原数组排序
	sort($arr);		//升序
	print_r($arr);
	/*Array ( [0] => 2 [1] => 4 [2] => 5 [3] => 6 [4] => 8 )*/
	
	//从大到小排序
	rsort($arr);	//降序
	print_r($arr);
	/*Array ( [0] => 8 [1] => 6 [2] => 5 [3] => 4 [4] => 2 )*/
	//------------------------------------------------------
	//-----------------按键名对数组排序--------------------
	$arr=array(2=>"two",5=>"five",4=>"four");
	ksort($arr);	//升序
	print_r($arr);
	/*Array ( [2] => two [4] => four [5] => five )*/
	krsort($arr);	//降序
	print_r($arr);
	/* Array ( [5] => five [4] => four [2] => two )*/
	//------------------------------------------------------
	//------------------数组排序保留键名-------------------
	//将数组进行排序,保留原始键名
	$arr=array("1"=>"hello","two"=>"nihao","3"=>"funny");
	asort($arr);	//升序
	print_r($arr);
	/*Array ( [3] => funny [1] => hello [two] => nihao )*/
	arsort($arr);	//降序
	print_r($arr);
	/*Array ( [two] => nihao [1] => hello [3] => funny )*/
	//------------------------------------------------------
	//------------------按自然数排序-----------------------
	$arr=array("one1","One2","one11","one22");
	natsort($arr);			//区分大小写
	print_r($arr);
	/*Array ( [1] => One2 [0] => one1 [2] => one11 [3] => one22 )*/
	natcasesort($arr);		//不区分大小写
	print_r($arr);
	/*Array ( [0] => one1 [1] => One2 [2] => one11 [3] => one22 )*/
	//------------------------------------------------------
	//----------------自定义规则对数组排序-----------------
	$arr=array("Linux","Apache","MySQL","PHP");
	usort($arr,"sortByLen");	//uasort() uksort()
	//按字符串长度进行排序
	function sortByLen($one,$two){
		if(strlen($one)==strlen($two))
			return 0;
		else
			return (strlen($one)>strlen($two))?1:-1;
	}
	print_r($arr);
	/*Array ( [0] => PHP [1] => MySQL [2] => Linux [3] => Apache )*/
	//多维数组排序
	array_multisort();
//====================拆分合并分解接合数组=================
//------------------------截取数组--------------------------
	$arr=array("Linux","Apache","MySQL","PHP");
	//将数组从第一个开始取取出两个
	$arr=array_slice($arr,1,2);
	/*Array ( [0] => Apache [1] => MySQL )*/
	//从倒数第二个开始取取两个
	$arr=array_slice($arr,-2,2);
	/*Array ( [0] => MySQL [1] => PHP )*/
	//使用第三个参数保留原有下标
	$arr=array_slice($arr,-2,2,true);
	/*Array ( [2] => MySQL [3] => PHP )*/
	//------------------------------------------------------
	//------------------键名与键值组合---------------------
	$arr=array("Linux","Apache","MySQL","PHP");
	$arr1=array("one","two","three","four");
	//第一个数组作为键名第二个数组作为键值
	$arr=array_combine($arr1,$arr);
	print_r($arr);
	/*Array ( [one] => Linux [two] => Apache [three] => MySQL [four] => PHP )*/
	//-------------------------------------------------------
	//--------------------合并数组--------------------------
	$arr=array("Linux","Apache","MySQL","PHP");
	$arr1=array("one","two","three","four");
	$arr=array_merge($arr,$arr1);
	print_r($arr);
	/*Array ( [0] => Linux [1] => Apache [2] => MySQL [3] => PHP 
	[4] => one [5] => two [6] => three [7] => four )*/
	//------------------------------------------------------
	//--------------------求数组交集-----------------------
	$arr=array("Linux","Apache","MySQL","PHP");
	$arr1=array("Linux","hello","java","PHP");
	$arr=array_intersect($arr,$arr1);
	print_r($arr);
	/*Array ( [0] => Linux [3] => PHP )*/
	//------------------------------------------------------
	//--------------------求数组差集-----------------------
	$arr=array("Linux","Apache","MySQL","PHP");
	$arr1=array("Linux","hello","java","PHP");
	$arr=array_diff($arr,$arr1);
	print_r($arr);
	/*Array ( [1] => Apache [2] => MySQL )*/
//====================删除数组中的元素=====================
//--------------------------unset---------------------------
	$arr = array("one"=>"one","two"=>"222222","222");
	unset($arr['one']);
	print_r($arr);
	/*Array ( [two] => 222222 [0] => 222 ) */
	//------------------------------------------------------
	//------------array_splice删除数组中元素---------------
	/*删除用法:参数分别为:1.数组,2.开始删除的位置(数
	组下标,从0开始,可正可负,负数则倒着数),3.删除的
	个数(0为全部删除),并返回被删除的元素数组*/
	$arr = array("one","two","three","four","five");
	$arr1 = array_splice($arr,1,2);
	print_r($arr1);
	/*Array ( [0] => two [1] => three )*/
	print_r($arr);
	/*Array ( [0] => one [1] => four [2] => five )*/
	//------------------------------------------------------
	//------------array_splice替换数组中元素---------------
	/*替换数组中的元素用法:参数分别为:1.被替换元素的数
	组,2.开始替换的位置,3.替换的个数(0为全部替换),4.要
	替换为的数组,返回被替换的数组*/
	$arr1 = array("one","two","three","four","five");
	$arr2 = array("xx","xxx");
	$arr3 = array_splice($arr1,1,2,$arr2);
	print_r($arr1);
	/*Array ( [0] => one [1] => xx [2] => xxx [3] => four [4] => five )*/
	print_r($arr3);
	/*Array ( [0] => two [1] => three )*/
//====================数据结构的数组函数===================
//-----------------------数组实现栈-------------------------
	//栈:先进先出
	//入栈
	$arr=array("MySQL","PHP");
	array_push($arr,"one");	//向栈中压入数据
	print_r($arr);
	/*Array ( [0] => MySQL [1] => PHP [2] => one )*/
	//出栈
	$arr=array("MySQL","PHP","one");
	$arr=array_pop($arr);		//弹出栈中的数据
	print_r($arr);
	/* Array ( [0] => MySQL [1] => PHP )*/
	//------------------------------------------------------
	//--------------------数组实现堆-----------------------
	//堆列:先进后出
	$arr=array("MySQL","PHP");
	array_unshift($arr,"one");	//压入的值再前面
	print_r($arr);
	/*Array ( [0] => one [1] => MySQL [2] => PHP )*/
	//从堆头删除数据
	$arr=array("MySQL","PHP","one");
	array_shift($arr);	//前面的值出堆
	print_r($arr);
	/*Array ( [0] => PHP [1] => one )*/
	//删除数组中的任意值
	$arr=array("MySQL","PHP","one");
	unset($arr[1]);
	print_r($arr);
	/*Array ( [0] => MySQL [2] => one )*/
//===================其他数组操作函数======================
//-------------------随机从数组中取值----------------------
	$arr=array(4,5,6,8,2,9,7,2,56,12,78,23);
	//取出的是下标
	$num=array_rand($arr);
	print_r($arr[$num]);	//数组下标所对应的值
	//------------------------------------------------------
	//----------------随机打乱数组元素顺序----------------
	$arr=array(4,5,6,8,2,9,7,2,56,12,78,23);
	//将原数组顺序随机打乱
	shuffle($arr);
	print_r($arr);
	//------------------------------------------------------
	//------------------对数组元素求和---------------------
	$arr=array(4,5,6,8,2,9,7,2,56,12,78,23);
	echo array_sum($arr);
	//和为:212
	//------------------------------------------------------
	//------------创建一个包含指定范围的数组--------------
	//参数:起始,结束,间隔
	//对50从0开始裁剪,每10为一个
	$arr=range(0,50,10);
	print_r($arr);
	/*Array ( [0] => 0 [1] => 10 [2] => 20 [3] => 30 [4] => 40 [5] => 50 )*/
	$arr=range("a","k");
	print_r($arr);
	/*Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )*/
//----------------------------------------------------------
//==========================================================






// *********************一、数组操作的基本函数*******************

// ***************************数组的键名和值***************************
array_search("apple",$arr)	//在数组中检索apple ,如果存在返回键名
array_key_exists("apple",$arr)//检索给定的键名是否存在数组中
isset($arr[apple])			//检索给定的键名是否存在数组中
// ***************************数组的内部指针***************************
current($arr)				//返回数组中的当前单元
pos($arr)					//返回数组中的当前单元
key($arr)					//返回数组中当前单元的键名
prev($arr)					//将数组中的内部指针倒回一位
next($arr)					//将数组中的内部指针向前移动一位
end($arr)					//将数组中的内部指针指向最后一个单元
reset($arr)					//将数组中的内部指针指向第一个单元
each($arr)					//将返回数组当前元素的一个键名--值的构造数组,
							//并使数组指针向前移动一位

// ***************************数组和变量之间的转换***************************
extract($arr)				//用于把数组中的元素转换成变量导入到当前文件中,
							//键名当作变量名,值作为变量值。
							//注:(第二个参数很重要,可以看手册使用)
							//使用方法 echo $a//
compact(var1,var2,var3)		//用给定的变量名创建一个数组

// *********************二、数组的分段和填充***************************

// ***************************数组的分段***************************
array_slice($arr,0,3)						//可以将数组中的一段取出,此函数忽略键名
array_splice($arr,0,3,array("black","maroon"))//可以将数组中的一段取出,
											//与上个函数不同在于返回的序列从原数组
											//中删除

// ***************************分割多个数组***************************
array_chunk($arr,3,TRUE)			//可以将一个数组分割成多个,TRUE为保留原数组的键名
// ***************************数组的填充***************************
array_pad($arr,5,'x')				//将一个数组填补到制定长度
// ***************************三、数组与栈***************************
array_push($arr,"apple","pear")		//将一个或多个元素压入数组栈的末尾
									//(入栈),返回入栈元素的个数
array_pop($arr)						//将数组栈的最后一个元素弹出(出栈)
// ***************************四、数组与列队***************************
array_shift($arr)						//数组中的第一个元素移出并作为结果返回
									//(数组长度减1,其他元素向前移动一位,
									//数字键名改为从零技术,文字键名不变)
array_unshift($arr,"a",array(1,2))	//在数组的开头插入一个或多个元素
// ***************************五、回调函数***************************
array_walk($arr,'function','words')		//使用用户函数对数组中的每个成员
									//进行处理(第三个参数传递给回调函数function)
array_map("function",$arr1,$arr2)		//可以处理多个数组(当使用两个或更多数组时,
									//他们的长度应该相同)
array_filter($arr,"function")			//使用回调函数过滤数组中的每个元素,如果回调
									//函数为TRUE,数组的当前元素会被包含在返回的
									//结果数组中,数组的键名保留不变
array_reduce($arr,"function","*")		//转化为单值函数(*为数组的第一个值)

// ***************************六、数组的排序***************************

// ***************************通过元素值对数组排序***************************
sort($arr)							//由小到大的顺序排序(第二个参数为
									//按什么方式排序)忽略键名的数组排序
rsort($arr)							//由大到小的顺序排序(第二个参数为按
									//什么方式排序)忽略键名的数组排序
usort($arr,"function")				/*使用用户自定义的比较函数对数组中的
									值进行排序(function中有两个参数,
									0表示相等,正数表示第一个大于第二个,
									负数表示第一个小于第二个)忽略键名的数组排序*/
asort($arr)							/*由小到大的顺序排序(第二个参数
									为按什么方式排序)保留键名的数组排序*/
arsort($arr)							/*由大到小的顺序排序(第二个参数为按
									什么方式排序)保留键名的数组排序*/
uasort($arr,"function")				//使用用户自定义的比较函数对数组中的值
									//进行排序(function中有两个参数,0表示相等,
									//正数表示第一个大于第二个,负数表示第一个小
									//于第二个)保留键名的数组排序
// ***************************通过键名对数组排序***************************
ksort($arr)							//按照键名正序排序
krsort($arr)							//按照键名逆序排序
uksort($arr,"function")				//使用用户自定义的比较函数对数组中的
									//键名进行排序(function中有两个参数,
									//0表示相等,正数表示第一个大于第二个,
									//负数表示第一个小于第二个)
// ***************************自然排序法排序***************************
natsort($arr)						//自然排序(忽略键名)
natcasesort($arr)					//自然排序(忽略大小写,忽略键名)

// ***************************七、数组的计算***************************

// ***************************数组元素的求和***************************
array_sum($arr)						//对数组内部的所有元素做求和运算
// ***************************数组的合并***************************
array_merge($arr1,$arr2)				//合并两个或多个数组(相同的字符串键名,
									//后面的覆盖前面的,相同的数字键名,
									//后面的不会做覆盖操作,而是附加到后面)
									//“+”$arr1+$arr2 对于相同的键名只保留第一个
									//(详细说明可参考:http://www.qianyunlai.com/blog/138.html)
array_merge_recursive($arr1,$arr2)	//递归合并操作,如果数组中有相同的字符串键名,
									//这些值将被合并到一个数组中去。如果一个值本
									//身是一个数组,将按照相应的键名把它合并为另
									//一个数组。当数组 具有相同的数组键名时,后一个
									//值将不会覆盖原来的值,而是附加到后面
// ***************************数组的差集***************************
array_diff($arr1,$arr2)				//返回差集结果数组
array_diff_assoc($arr1,$arr2,$arr3)	//返回差集结果数组,键名也做比较
// ***************************数组的交集***************************
array_intersect($arr1,$arr2)			//返回交集结果数组
array_intersect_assoc($arr1,$arr2)		//返回交集结果数组,键名也做比较
// ***************************八、其他的数组函数***************************
range(0,12)							//创建一个包含指定范围单元的数组
array_unique($arr)					//移除数组中重复的值,新的数组中会保留原始的键名
array_reverse($arr,TRUE)			//返回一个单元顺序与原数组相反的数组,如果
									//第二个参数为TRUE保留原来的键名
									//srand((float)microtime()*10000000)//随机种子触发器
array_rand($arr,2)					//从数组中随机取出一个或 多个元素
shuffle($arr)						//将数组的顺序打乱