• 细说php(六) 数组


    一、数组概述

    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 />
    ";
    	}
    	
    	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()  建立一个包括指定范围单元的数组



  • 相关阅读:
    设计模式:观察者模式
    设计模式:享元模式
    面试题:redis主从数据库不一致如何解决?
    面试题:Object obj = new Object()这句话在内存里占用了多少字节
    面试题:AtomicInteger和LongAdder区别
    @PrePersist 注解
    树莓派 zero w 添加微雪墨水屏 显示天气
    数据仓库项目中的数据建模和ETL日志体系
    TO B业务的发展
    Kylin、Druid、ClickHouse核心技术对比
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4047840.html
Copyright © 2020-2023  润新知