#一、PHP陣列基礎部分 |
一PHP陣列的分類
依照下標的不同,PHP數組分為關聯數組和索引數組;
索引數組:下標從0開始,依次增長
關聯數組:下標為字串格式,每個下標字串與陣列的值一一關聯對應(類似物件的鍵值對)
#
程式碼示範:
$arr1 = array(1,2,3,4,5,6,7);//索引数组 var_dump($arr1); $arr2 = array("one"=>1,"two"=>2,"three"=>3);//关联数组 var_dump($arr2); $arr3 = array(1,"one"=>2,3,5=>4,5,6,"10.0"=>7,"08"=>8,"08"=>10,"hahah"=>9); var_dump($arr3);
#二關於關聯數組與索引數組
#1、陣列中,可以同時存在索引陣列與關聯數組。
三数组的声明方式
1、直接赋值声明
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
var_dump($arr);
2、[]字面量声明(PHP5.4版本之后能用)
$arr = [1,2,3,4,"one"=>5,6];
var_dump($arr);
3、Array()声明 没有new关键字
$arr = array(1,2,3,4,5);
var_dump($arr);
四数组元素的读取
PHP中,数组支持[]和{}读取下标。
五多维数组
①数组的一个值,依然是一个数组,我们称这种数组为多维数组;
②多维数组,不要求所有的项都是数组,可以是数组与普通值的混合;
③多维数组,也不要求每个子数组的个数限制,可以是任意的长度。
使用多维数组,一定要注意,数组中分隔用逗号!
原则上,多维数组一般不超过3层使用!
三维数组代码演示如下:
$H51701 = array( "group1"=>array( array("name"=>"张三","age"=>14,"sex"=>"男"), array("name"=>"李四","age"=>15,"sex"=>"男"), array("name"=>"王二","age"=>13,"sex"=>"男") ), "group2"=>array( array("name"=>"张三","age"=>15,"sex"=>"男"), array("name"=>"李四","age"=>15,"sex"=>"男"), array("name"=>"王二","age"=>14,"sex"=>"男") ), "group3"=>array( array("name"=>"张三","age"=>14,"sex"=>"男"), array("name"=>"李四","age"=>18,"sex"=>"男"), array("name"=>"王二","age"=>24,"sex"=>"男") ), ); var_dump($H51701);
二、数组遍历 |
1、使用for循环遍历数组
count($arr);用于统计数组元素的个数
for循环只能用于遍历,纯索引数组!
如果存在关联数组,count统计时会统计两种数组的总个数,使用for循环遍历混合数组,导致数组越界!
代码如下:
$arr = array(1,2,3,"one"=>4,5,6,7); $num = count($arr); echo"数组元素的个数{$num}<br/>"; for($i=0;$i<$num;$i++){ echo "{$i}==>{$arr[$i]}<br/>"; }
2、forEach循环遍历数组
foreach可以遍历任何类型的数组!
代码如下:
$arr = array(1,2,3,"one"=>4,5,6,7); foreach($arr as $key=>$item){ echo "{$key}==>{$item}<br/>"; }
下面我们来做一个数组遍历的小练习~看代码~
$arr = array( "group1"=>array( array("name"=>"张三","age"=>14,"sex"=>"男"), array("name"=>"李四","age"=>12,"sex"=>"男"), array("name"=>"王二","age"=>18,"sex"=>"男") ), "group2"=>array( array("name"=>"张三","age"=>14,"sex"=>"男"), array("name"=>"李四","age"=>16,"sex"=>"男"), array("name"=>"王二","age"=>19,"sex"=>"男") ), "group3"=>array( array("name"=>"张三","age"=>14,"sex"=>"男"), array("name"=>"李四","age"=>12,"sex"=>"男"), array("name"=>"王二","age"=>13,"sex"=>"男") ), ); foreach($arr as $key=>$value){ echo "{$key}<br/>"; foreach($value as $key1=>$value1){ echo "第".($key1+1)."个同学<br/>"; foreach($value1 as $key2=>$value2){ echo "{$key2}==>{$value2}<br/>"; } echo"<br/>"; } echo"----------------------<br/>"; }
3、使用list(),each(),while()遍历数组
list():用于将数组的每一个值,赋值给list函数的每一个参数。(list函数的参数,必须
eg:list($a,$b,$c) = [1,2,3]; --->$a=1; $b=2; $c=3;
注意:
①list()在解析数组时,只解析索引数组;
②list可以通过空参数,选择性的解析数组的值;
list($a,,$b)=[1,2,3];-->$a=1;$b=3;
each():用于返回数组当前指针所在位的键值对!并将指针后移一位;
返回值:如果指针有下一位,返回一个数组。包含一个索引数组(0-键,1-值)和一个关联数组("key"-键,"value"-值);
如果指针没有下一位,返回false。
4、使用list()/each()/while()配合遍历数组※※※
while(list($key,$value) = each($arr)){ echo "{$key}-->{$value}<br>"; } reset($arr);
!!!数组使用each()遍历完一遍后,指针使用处于最后一位的下一位,即再用each(),始终返回false;
如果还需使用,需用reset($arr);函数,重置数组指针。
$arr = [1,2,3,4];
list($a,$b,$c,$d) = $arr;
echo "a-->{$a}
";
echo "b-->{$b}
";
echo "c-->{$c}
";
echo "d-->{$d}
";
while($a = each($arr))
①each($arr)返回数组或false;
②把数组或false赋值给$a;
③while判断$a如果是数组,继续执行下一位;
如果$a是false,终止循环。
while($a = each($arr)){ echo "{$a[0]}-->{$a[1]}<br>"; echo "{$a['key']}-->{$a['value']}<br>"; } while(true){ $a = each($arr); if($a){ echo "{$a[0]}-->{$a[1]}<br>"; echo "{$a['key']}-->{$a['value']}<br>"; }else{ break; } } while(list($key,$value) = each($arr)){ echo "{$key}-->{$value}<br>"; } reset($arr);
5、使用数组指针遍历数组
①next:将数组指针,后移一位,并返回后一位的值,没有返回false
②prev:将数组指针,前移一位,并返回前一位的值,没有返回false
③end:将数组指针,移至最后一位,返回最后一位的值,空数组返回false
④reset:将数组指针,恢复到第一位,并返回第一位的值,空数组返回false
⑤key:返回当前指针所在位的键;
⑥current:返回当前指针所在位的键;
$arr = [1,2,3,4,"one"=>5]; while(true){ echo key($arr); echo "--"; echo current($arr); echo "<br>"; if(!next($arr)){ break; } } reset($arr); do{ echo key($arr); echo "--"; echo current($arr); echo "<br>"; }while(next($arr)); reset($arr);
三、超全局数组 |
超全局数组,超全局变量,预定义数组,预定义变量——说的都是它。
PHP给我们提供了一组包含强大功能的超全局数组,可以在任何地方,任何作用域不需声明,直接使用!不受任何作用域限制。
PHP超全局数组
1、服务器变量: $_SERVER
2、环境变量:$_ENV
3、HTTP GET变量:$_GET
4、HHTP POST变量:$_POST
5、request变量:$_REQUEST
6、HTTP文件上传变量:$_FILES
7、HTTP Cookies:$_COOKIE
8、Session变量:$_SESSION
9、Global变量:$GLOBALS
1、服务器变量: $_SERVER
var_dump($_SERVER);
echo ($_SERVER{'HTTP_USER_AGENT'});
2、环境变量:$_ENV
将系统环境变量,转变为PHP中的数组,就是$_ENV;
PHP默认是关闭此全局数组的。如果需要使用,
需修改php.ini文件中的variables_order = "GPSC",
改为variables_order = "EGPSC";
但是,修改后会有系统性能损失,港方并不推荐使用。
可以使用getenv()函数取代全局变量,取出每个系统环境变量的值。
phpinof();函数,包含了有关PHP的各种信息,其实environment板块就是系统环境的变量,可以使用getevn()函数取出其中的值;
3、HTTP GET变量:$_GET
获取前台通过get方式提交的数据
if(isset($_GET["sybmit"]&&isset($_GET["pwd"]))){ if($_GET["username"]=="111"&&$_GET["pwd"]=="111"){ echo "Get登录成功!"; }else{ echo "Get登录失败!"; } }
4、HHTP POST变量:$_POST
获取前台通过post方式提交的数据
if(isset($_POST["sybmit"])){ if($_POST["username"]=="111"&&$_POST["pwd"]=="111"){ echo "POST登录成功!"; }else{ echo "POST登录失败!"; } }
5、request变量:$_REQUEST
包含了$_GET,$_POST和$_COOKIE的数组
由于request同时包含get和post,可能导致get与post的键冲突,并且频率也不高。所以,并不使用request。
var_dump($_REQUEST);
6、HTTP文件上传变量:$_FILES
通过HTTP POST方式上传到当前脚本的项目的数组。
var_dump($_FILES);
7、HTTP Cookies:$_COOKIE
取到页面中的Cookie信息
1 setcookie("cookie","haha");
2 $_COOKIE["hehe"] = "hehe";
3 var_dump($_COOKIE);
8、Session變數:$_SESSION
取到儲存在Session中的資訊。
session_start();
$_SESSION["haha"] = "haha";
var_dump($_SESSION);* /
9、Global變數:$GLOBALS
#$GLOBALS包含了上述8個全域數組,可以透過$GLOBALS["_SERVER"]取到$_SERVER
也可以透過$GLOBALS陣列追加下標。建立全域變量,可以在函數裡函數外隨意存取:$GLOBALS["name"] = "zhangsan";
var_dump($GLOBALS["_SERVER"]);
四、陣列功能 |
1、返回数组所有的值,返回数组
var_dump(array_values($arr));
2、返回数组所有的键,返回数组
var_dump(array_keys($arr));
3、检测数组中是否包含某个值。返回真、假
参数:需要查询的值,数组,true(===)/false(===) 默认
var_dump(in_array("8",$arr,true));
4、交换数组中的键和值,返回新数组
var_dump(array_flip("8",$arr));
5、反转数组,返回新数组
参数:需要反转的数组
true:保留原有索引数组的下标与值的匹配。
false:只反转值,键不反转,默认
无论true/false,都不会影响关联数组,关联数组键,值永远是一对。
var_dump(array_reverse($arr,true));
6、统计数组元素个数
count($arr);
7、统计数组中,所有值出现的次数,返回一个新数组
新数组格式:键-->原数组的值(去重后的值)
值-->原数组对应的值出现的次数。
var_dump(array_count_values($arr));
8、移出数组中重复的值!
var_dump(array_unique($arr));
9、过滤数组中的每一个值:
①不传回调函数:过滤掉所有空值(0/""/null/false/"0"/[])
②传回调函数:需要给回调函数传递一个参数,判断参数是否符合要求,如果符合,return true;否则,return false。
var_dump(array_filter($arr,function($num){ if($num>4){ return true; }else{ return false; } }));
通过回调函数,对数组的每一个值,进行处理操作。(直接修改原数组,并返回bool类型的是否成功)
执行时,会给回调函数传递两个参数,分别是数组的value,key,然后可以在毁掉函数中,对值和键进行处理。
但是,牵扯到修改值的时候,必须要传递地址&!!!!
$fruits = array("d" => "lemon","a" => "orange","b" => "banana","c" => "apple");
var_dump(array_walk($fruits,function(&$item,$key){ echo "{$key}-->{$item}<br>"; $item .= $key; })); var_dump($fruits);
将数组的每个值交由回调函数进行映射处理
array_map():第一个参数,是一个回调函数。第二个参数起,是>=1个数组。
有几个数组,可以给回调函数传几个参数,,表示每个数组的一个value;
可以对value进行处理,处理完以后通过return返回,那么新数组的对应的值就是你return回去的值。
【array_map与array_walk的异同】
相同点:都能遍历数组,通过回调函数,重新处理数组的每一个值;
不同点:
①walk只能传一个数组,回调函数接收这个数组的值和键;
map可以传多个数组,回调函数接收每个数组的值;
②walk直接修改原数组,而map不修改原数组,将新数组返回;
③walk给回调函数传递一个其余参数,map只能传数组的值;
④处理方式上,walk如果需要改掉原数组的值,需在回调函数中传递地址,直接修改变量的值;
而map,是通过将新的值,用return返回,即可修改新数组的值。
$a = [1,2,3,4,5];
$b = [1,2,3,4,5];
var_dump(array_walk($fruits,function(&$item,$key){ echo "{$key}-->{$item}<br>"; $item .= $key; })); var_dump($fruits);
五、数组函数 |
sort -- -- 對數組排序(升序)
#var_dump(sort($arr));
rsort--對陣列逆向排序(降序)
#usort--使用使用者自定義的比較函數對數組中的值進行排序
asort--對數組進行排序並保持索引關係(關聯數組排序)
arsort--對陣列進行逆向排序並保持索引關係
##uasort --使用者自訂的比較函數對陣列進行排序並保持索引關聯
#ksort--對陣列依照鍵名排序
krsort--對陣列依照鍵名稱逆向排序
uksort--使用使用者自訂的比較函數對陣列中的鍵名進行排序
#natsort
--以「自然排序」演算法對陣列排序
natcasesort
--用「自然排序」演算法對陣列不區分大小寫字母排序
array_multisort
-- 對多個數組或多維數組進行排序
第一個參數:第一個數組,必選
#第二個參數:SORT_DESC;SORT_ASC(升序降序);
第三個參數:SORT_STRING/SORT_NUMERIC(依照字串還是數字排序)
排序規則:先排第一個數組,後面的數組會根據和第一個數組的對應關係,一列一列的排序;
如果多個陣列多個陣列排序,排序的陣列長度要相等,否則封包警告;
array_slice($array, $offset)
#第一個參數:數組,必須;
第二個參數:從第幾位開始截,負數表示從右到左數(依照陣列的順序ps:包含關聯數組,而非下標)
第三個參數:截取的長度,可選,預設截取到最後
第四個參數:bool類型的參數,預設為false,索引重新排序,true保持索引關聯
#array_splice($offset)
傳回值:陣列(被刪除的部分)
參數:
array_merge($array1);合併一個或多個數組
合併多個數組,將後面的數組拼接在前面數組的後面
如果多個陣列中存在多個同名的關聯鍵,則後面的會覆寫前面的
array_intersect( $array1, $array2);兩個數組取交集
多個數組取交集,結果會保留第一個數組的鍵值關聯匹配
array_diff($array1, $array2);多個陣列取差集合;
取出多個陣列中,在第一個陣列中包含,但是在其他陣列中不包含的值,保留第一個陣列的鍵值關聯;
array_pop();
#刪除陣列最後一個值;傳回刪除的值;
array_push($var);
陣列的最後插入一個或多個值;傳回處理之後元素的個數
array_shift();
刪除陣列第一個值;傳回刪除的值;
陣列的開頭插入一個或多個值;傳回處理之後元素的數量
array_rand($input);
隨機抽出陣列中的一個到多個鍵名!第二個參數為空,表示抽一個,傳入數字n表示抽n個以上是PHP數組實用基礎知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。