PHP 中操作数组的知识点

PHP技术
428
0
0
2023-02-14

数组的赋值: PHP中的数组既可以做数组,也可以做键值对字典,且不存在限制,非常灵活.

<?php
	// 定义纯数组格式
	$array_one[0] = 100;
	$array_one[1] = 200;
	$array_one[2] = "lyshark";
	$array_one[3] = [1,2,3,4,5,6];
	
	echo $array_one[0] . $array_one[2] . "<br>";
	echo "数组中的数组: " . $array_one[3][1] . "<br>";
	
	// 定义字典格式的数组
	$array_two['ID'] = 1001;
	$array_two['name'] = "lyshark";
	$array_two['age'] = 25;
	
	echo "姓名: " . $array_two['name'] . "<br>";
?>

数组的定义与遍历: 分别定义一维数组与二维数组,并通过两种方式分别遍历数组元素.

<?php
	// 定义一维数组
	$var = array("first"=>1,"second"=>2,"third"=>3,"montd"=>4);
	foreach ($var as $key => $value)
	{
		echo "键 => {$key} --> 值 => {$value} <br>";
	}
	
	// 定义二维数组
	$var_two = array(
	"书籍" => array("文学","历史","地理"),
	"水果" => array(1=>"苹果",2=>"橙子",3=>"水蜜桃"));
	
	foreach($var_two as $key => $value)
	{
		echo "键=" . $key . " ";
		foreach($var_two[$key] as $index => $value)
		{
			echo "  索引: " . $index . " --> 值: " . $value;
		}
		echo "<br>";
	}
	
	// 二维数组其他遍历方法
	$array_two = array(
	array('北京','上海','深圳','广州'),
	array('黑龙江','吉林','辽宁','江苏'));
	
	for($x=0; $x< count($array_two); $x++)
	{
		for($y=0; $y<count($array_two[$x]); $y++)
		{
			echo "输出数组: " . $array_two[$x][$y] . "<br>";
		}
	}
?>

数组元素统计: 统计出数组中指定元素的个数,或者统计每个元素出现的次数.

<?php
	// 一维数组统计
	$lamp = array("Linux","Apache","MySQL","PHP");
	echo "lamp 元素个数: " . count($lamp) . "<br>";

	// 二维数组统计
	$web = array(
		'lamp' => array("Linux","Apache","MySQL","PHP"),
		'j2ee' => array("Unix","Tomcat","Oracle"));
		
	echo "二维中一维个数: " . count($web) . "<br>";
	echo "整个数组的大小: " . count($web,1) . "<br>";

	// 统计元素出现次数,返回数组
	$array = array("php","asp","jsp","php","python","node.js");
	$new_array = array_count_values($array);
	foreach($new_array as $key => $value)
	{
		echo "数组元素 => {$key} ---> 出现频率 => {$value} <br>";
	}
?>

二维数组遍历回显: 通过传统的循环结构遍历特定数组中的元素,并用表格展示出来.

<?php
	$data = array(
		array(1,'admin','北京',"admin@blib.cn"),
		array(2,'guest','天津',"guest@blib.cn"),
		array(3,'lyshark','洛杉矶',"lyshark@blib.cn"));
	
	echo "<table border='1' width='600' align='center'>";
	echo "<caption><h1>输出列表</h1></caption>";
	echo "<tr bgcolor='#ddddddd'>";
	echo "<th>编号</th><th>姓名</th><th>住址</th><th>邮箱</th>";
	echo "</tr>";
	
	for($row=0; $row < count($data); $row++)
	{
		echo "<tr>";
		for($clo=0; $clo<count($data[$row]); $clo++)
		{
			echo "<td>" . $data[$row][$clo] . "</td>";
		}
		echo "</tr>";
	}
	echo "</table>";
?>

三维数组遍历回显: 由于FOR语句遍历数组的局限性,所以PHP中提供了更加强大的ForEach结构.

<?php
	$data = array(
		"市场部" => array(array(1,"张某","经理",5000),array(2,"刘某","员工",3000)),
		"销售部" => array(array(1,"李某","职员",2000),array(2,"孙某","经理",6000)),
		"财务部" => array(array(1,"吴某","经理",8000))
	);
	
	foreach($data as $sector => $table)
	{
		echo "<table border='1' width='600' align='center'>";
		echo "<caption><h1>" . $sector . "</h1></caption>";
		echo "<tr bgcolor='#ddddddd'>";
		echo "<th>编号</th><th>姓名</th><th>职务</th><th>薪资</th>";
		echo "</tr>";
		
		foreach($table as $row)
		{
			echo "<tr>";
			foreach($row as $col)
			{
				echo "<td>" . $col . "</td>";
			}
			echo "</tr>";
		}
		echo "</table><br>";
	}
?>

指针操作数组: 数组内部指针式数组内部的组织机制,指向一个数组中的某个元素.

<?php
	$info = array('admin','guest','lyshark');
	
	// 将数组中所有的的元素转换为变量
	list($x,$y,$z) = $info;
	echo "变量: " . $x . $y . $z . "<br>";
	
	// 将数组中指定元素转换为变量
	list(,,$z)= $info;
	echo "变量: " . $z . "<br>";

	// 数组指针操作
	reset($info);
	echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";
	next($info);
	echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";
	prev($info);
	echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";
	end($info);
	echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";
	
	// 通过指针循环遍历
	for(reset($info); current($info);next($info))
	{
		echo "数据: " . current($info) . "<br>";
	}
?>

数组键值对操作: 数组中的每个元素都是由键值对组成的,通过元素的键访问对应的值.

<?php
	$info = array("ID" => 1001,"Name" => "admin","Age" => 24 );
	$var1 = array("a"=>"python","b"=>"php","c"=>"C/C++","d"=>"java");
	$var2 = array("1"=>"a","2"=>"b","3"=>"c","4"=>"d");
	
	// 获取所有的键值
	print_r(array_keys($info));
	print_r(array_values($info));
	
	// 获取特定的键
	print_r(array_keys($info,"admin"));
	
	// 值作为新数组的键
	$new = array_combine($var1, $var2);
	print_r($new); echo"<br>";
	
	// extrace()将数组转换成标量变量
	extract($var1);
	echo $a."<br>";
	echo $b."<br>";
?>

判断键值是否存在: 检查特定数组中是否存在某个值,即在数组中搜索给定的值.

<?php
	// 函数的简单用法
	$info = array("Mac","Windows NT","AIX","Linux");
	if(in_array("Mac",$info))
		echo "存在 <br>";
	
	// 严格模式,必须类型一致,否则失败
	$info = array('10.24',12,45,1,2);
	if(in_array(10.24,$info,true))
		echo "存在 <br>";
	
	// 查询数组中的数组
	$info = array(array(1,2),array(3,4));
	if(in_array(array(3,4),$info))
		echo "存在 <br>";
	
	// search 同样可以实现检索
	$info = array("ID" => 1001,"Name" => "admin","Age" => 24 );
	if(array_search("admin",$info))
		echo "存在 <br>";
	
	// 检查下标元素是否在数组中
	if(array_key_exists('ID',$info))
		echo "存在 <br>";
	
	// 使用isset同理
	if(isset($info['ID']))
		echo "存在 <br>";
?>

数组交换/统计/去重: 实现数组的交换,统计,与去重等操作.

<?php
	$info = array("OS" => "Linux","WebServer" => "Nginx", "DataBase" => "MySQL");
	
	// 交换数组中的键值
	$new_info = array_flip($info);
	
	print_r($info); echo "<br>";
	print_r($new_info); echo "<br>";
	
	// 数组元素反转
	$new_info = array_reverse($info);
	print_r($info); echo "<br>";
	print_r($new_info); echo "<br>";
	
	// 统计元素个数
	$var_count = count($info);
	echo "元素个数: " . $var_count . "<br>";
	
	// 统计数组中所有元素出现次数
	$array = array(1,2,3,3,2,4,5,6,6,7,7,7,6,8,7,4,3);
	$array_count = array_count_values($array);
	print_r($array_count); echo "<br>";
	
	// 数组元素去重操作
	$array = array("1" => "PHP","2" => "MySQL","3" => "PHP");
	print_r(array_unique($array));
?>

数组回调与过滤: PHP提供了回调函数,可以实现对数组中元素的过滤功能,例如将每个元素递增10等.

<?php
	// array_filter 定义第一个回调函数
	function EvenNumber($var)
	{
		if($var %2 ==0) return true;
	}
	$info = array(1,2,3,4,5,6,7,8,9,10);
	print_r(array_filter($info,"EvenNumber"));echo "<br>";
	
	// array_walk 第二种回调函数的过滤写法
	function PrintFunction($value,$key)
	{
		$value = $value + 10;
		echo "KEY= " . $key . "  VALUE= " . $value . "<br>";
	}
	$info = array("UID" => 1001,"GID" => 0, "age"=> 25);
	array_walk($info,"PrintFunction");
	
	// array_map 第三种回调函数过滤写法(可替换指定数组元素)
	function ReplaceMap($var1)
	{
		if($var1 === "MySQL")
			return "Oracle";
		return $var1;
	}
	$info = array("Linux","Windows","Apache","MySQL","PHP");
	print_r(array_map("ReplaceMap",$info));echo "<br>";
	
	// array_map 传递多个参数实现回调 (可用于对比多个数组的异同点)
	function Contrast($var1,$var2)
	{
		if($var1 == $var2)
			return "True";
		return "False";
	}
	$Array_A = array("Linux","PHP","MySQL");
	$Array_B = array("Linux","MySQL","MySQL");
	print_r(array_map("Contrast",$Array_A,$Array_B));
?>

基本的数组排序: 在PHP中提供了多种排序函数,相比于C来说更加的简单实用.

<?php
	// 对数组进行正反向排序
	$info = array(5,6,8,2,7,8,9,0,2,1,3,4,5);
	
	if(sort($info))
		echo "sort 正向排序:"; print_r($info);echo "<br>";
	if(rsort($info))
		echo "sort 反向排序:"; print_r($info);echo "<br>";
	
	// 根据key=>键名称来实现数组排序
	$info = array(5 => "five",8 => "eight",1 => "one");
	
	if(ksort($info))
		echo "ksort 正向排序:"; print_r($info);echo "<br>";
	if(krsort($info))
		echo "ksort 反向排序:"; print_r($info);echo "<br>";
	
	// 根据value=>值来实现数组排序
	$info = array(5 => "five",8 => "eight",1 => "one");
	
	if(asort($info))
		echo "asort 正向排序:"; print_r($info);echo "<br>";
	if(arsort($info))
		echo "asort 反向排序:"; print_r($info);echo "<br>";
	
	// 根据自然排序法对数组排序
	$info = array("file1","file11","File2","FILE12","file");
	
	if(natsort($info))
		echo "natsort 大写排在前面:"; print_r($info);echo "<br>";
	if(natcasesort($info))
		echo "natcasesort 忽略大小写自然排序:"; print_r($info);echo "<br>";
?>

自定义/多维数组排序: 除了使用上面提供的排序方法以外,我们还可以自定义排序规则.

<?php
	// 回调函数实现自定义排序
	$info = array("Linux","Apache","MySQL","PHP");
	
	function SortByLen($var1,$var2)
	{
		// 如果两个字符串长度一致则保留
		if(strlen($var1) === strlen($var2))
			return 0;
		else
			return (strlen($var1)>strlen($var2)?1:-1);
	}
	if(usort($info,"SortByLen"))
		echo "自定义排序:"; print_r($info);echo "<br>";
	
	// 多维数组的排序方法
	$info = array(
		array("id" => 1,"soft" => "Linux","rating" => 8),
		array("id" => 2,"soft" => "Apache","rating" => 1),
		array("id" => 3,"soft" => "Nginx","rating" => 5)
	);
	
	foreach($info as $key => $value)
	{
		// 将$info中每个元素中键为soft的值形成新数组$soft
		$soft[$key] = $value["soft"];
		$rating[$key] = $value['rating'];
	}
	
	array_multisort($rating,$soft,$info); // 开始排序
	echo "多维数组排序: "; print_r($info); echo "<br>";
?>

拆分/合并/分解数组: 数组常用的处理函数,包括对数组进行拆分,合并,结合,等常用操作.

<?php
	// array_slice(数组,开始下标,取出个数) 在数组中根据条件取值并返回.
	$info = array("Linux","PHP","Apache","MySQL","Nginx","Zabbix");
	print_r(array_slice($info,1,2));echo "<br>";
	
	// array_splice(数组,开始下标,替换次数,替换为) 替换指定数组中的指定元素
	$info = array("Linux","PHP","Apache","MySQL","Nginx","Zabbix");
	array_splice($info,1,1,"AAAA");
	echo "将下标1的位置替换为AAAA "; print_r($info); echo "<br>";

	array_splice($info,2);
	echo "从第2个元素向后的都删除掉 "; print_r($info); echo "<br>";
	
	// array_combine() 将两个数组合并为新数组 (两个数组必须相等)
	// 其中第一个数组为KEY 第二个数组为Value
	$key = array("1","2","3");
	$value = array("Apache","Nginx","Cpp");
	$new_array = array_combine($key,$value);
	echo "合并后: "; print_r($new_array); echo "<br>";
	
	// array_merge() 将两个数组合并为新数组 (合并时自动去重)
	$varA = array("a" => "Linux","b" => "MySQL");
	$varB = array("c" => "Python","a" => "PHP");
	echo "合并后: "; print_r(array_merge($varA,$varB)); echo "<br>";
	
	// array_ntersect()/array_diff() 计算两个数组的交集/差集
	$varA = array(1,2,3,4,5);
	$varB = array(3,4,5,6,7);
	echo "交集: "; print_r(array_intersect($varA,$varB));echo "<br>";
	echo "差集: "; print_r(array_diff($varA,$varB));echo "<br>";
?>

数组模拟实现栈/队列: 数组同样可以实现栈与队列的基本操作,如下所示.

<?php
	// 实现数组栈
	$stack = [];
	array_push($stack,1);
	array_push($stack,2);
	array_pop($stack);
	echo "简易版: "; print_r($stack);echo "<br>";
	
	// key-value类型的栈
	$kv_stack = array(1 =>"Linux");
	array_push($kv_stack,2,"Apache");
	echo "key-value版栈: "; print_r($kv_stack);echo "<br>";
	
	// 实现队列
	$kv_loop = array(1 =>"Linux");
	array_unshift($kv_loop, 2, "Apache");
	array_shift($kv_loop);
	echo "key-value 版队列: "; print_r($kv_loop);echo "<br>";
?>

数组的打乱/互转: 实现对数组的打乱,或将数组与字符串实现互相转换.

<?php
	// $var = array(1,2,3,4,5,6,7,8,9,10);
	$var = range(0,10);
	
	echo "当前数组: "; print_r($var); echo "<br>";
	echo "随机取出一个元素: " . array_rand($var,1) . "<br>";
	echo "随机打乱数组: " . shuffle($var) . "<br>";
	echo "数组求和: " . array_sum($var) . "<br>";
	
	array_unshift($var, "perl");   # 在数组头部添加元素
	print_r($var);echo "<br>";

	array_push($var, "golang");    # 在数组尾部添加元素
	print_r($var);echo "<br>";

	array_shift($var);             # 删除数组第一个元素
	print_r($var);echo "<br>";

	array_pop($var);               # 删除数组最后一个元素
	print_r($var);echo "<br>";

	// 将数组转为字符串/数组到字符串,互转.
	$var = array("python","php","C","java");
	$var = implode(",", $var);  # 数组转换为字符串
	echo "字符串: "; print_r($var); echo "<br>";

	$var = explode(",", $var);  # 字符串转数组
	echo "数组: "; print_r($var); echo "<br>";
?>