zl程序教程

您现在的位置是:首页 >  后端

当前栏目

细说php(六) 数组

PHP数组 细说
2023-09-14 09:10:25 时间

一、数组概述

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. 包括了来自WEBserver,client,执行环境和用户输入的数据
2. 提前定义数组在全局范围内自己主动生效,比如在函数中不用声明global也能够使用这些数组
3. 用户不能自己定义这些数组, 但这些数据操作方式又和我们自己定义的数组操作方式一样

 *   $_GET             // 经由URL请求提交至脚本的变量 
 *   $_POST           // 经由HTTP POST方法提交到脚本的变量
 *   $_REQUEST   // 经由GET, POST和COOKIE机制提交到脚本的变量,因此该数组并不值得信任,尽量不去使用
 *   $_FILES         // 经由HTTP POST 文件上传而提交至脚本的变量
 *   $_COOKIE      //
 *   $_SESSION   //
 *   $_ENV            // 运行环境提交至脚本的变量
 *   $_SERVER      // 变量由WEBserver设定的,或直接和当前脚本的运行环境相关联
 *   $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()  建立一个包括指定范围单元的数组