PHP數組解析和常見操做

在PHP裏面使用最多的數據結構恐怕就是數組了,不過PHP的數組和咱們傳統意義上的數組區別很大,PHP的數組功能上至關於其它語言裏面array+list+map數據結構的集合體,這就是動態語言的強大之處。在PHP裏面有2種數組,一種是傳統的索引數組,另外一種是關聯數組,其實就是其它語言裏面map數據結構。laravel

底層實現

PHP的數組底層是使用HashTable實現,說到哈希表估計不少人都瞭解過,PHP數組經過一個映射函數把key映射到對於的value值上面,因此查找起來很是快,時間複雜度是O(1),哈希表都會遇到衝突問題,在PHP裏面是經過鏈表的方式解決的。面試

//Bucket:散列表中存儲
typedef struct _Bucket {
	zval              val;  //存儲的具體value,這裏嵌入了一個zval,而不是一個指針
	zend_ulong        h;    //key根據times 33計算獲得的哈希值,或者是數值索引編號
	zend_string      *key;  //存儲元素的key
} Bucket;
 
//HashTable結構
typedef struct _zend_array HashTable;
 
struct _zend_array {
	zend_refcounted_h gc;
	union {
		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    flags,
				zend_uchar    nApplyCount,
				zend_uchar    nIteratorsCount,
				zend_uchar    reserve)
		} v;
		uint32_t flags;
	} u;
	uint32_t          nTableMask;      //哈希值計算掩碼,等於nTableSize的負值(nTableMask = -nTableSize)
	Bucket            *arData;         //存儲元素數組,指向第一個Bucket
	uint32_t          nNumUsed;        //已用Bucket數
	uint32_t          nNumOfElements;  //哈希表有效元素數
	uint32_t          nTableSize;      //哈希表總大小,爲2的n次方
	uint32_t          nInternalPointer;
	zend_long         nNextFreeElement;  ////下一個可用的數值索引,如:arr[] = 1;arr["a"] = 2;arr[] = 3;則nNextFreeElement = 2;
	dtor_func_t       pDestructor;

複製代碼

PHP7源碼裏面具體涉及到結構體如上,源碼我就不解讀了,主要是我也不太熟悉,只是看過一些介紹文章,可是但願你們能夠了解一下,下面我主要介紹一下PHP數組的一些經常使用函數,回顧一下基礎。數組

經常使用函數

PHP的數組函數很是多,可是提及這點我就頭疼,PHP的數組函數命名有些很是奇葩,有以 array_ 開頭的,也有一些不知道根據啥命名的...下面我就分類介紹一下:bash

1.排序類
// 默認排序是按從低到高,並且是引用傳遞,第二個參數能夠選擇排序類型
sort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) : bool
複製代碼

而後是一些以a、r、k、u組合的函數,不得不說這命名是真爛!數據結構

a 是associate,意思是排序是保留索引關聯,最多見的是 asort
r 是reverse,意思是逆序排,最多見的就是 rsort
k 是key,意思是按照數組的key進行排序,保留索引關聯,主要是用於關聯數組,最多見的就是 ksort
u 是user,意思使用用戶自定義函數的函數排序,最多見的就是 usort
複製代碼

好了,除了上面這4個以外,其它就是這幾個字母的組合的函數了,好比 arsort 是保留索引倒序排序、uksort 使用用戶自定義的比較函數對數組中的鍵名進行排序,其它我就很少說了。框架

2.遍歷類

除了可使用for 和 foreach循環遍歷數組以外,PHP還有不少其它遍歷數組,而且操做數組的函數函數

//爲數組的每一個元素應用回調函數
array_map ( callable $callback , array $array1 [, array $... ] ) : array

//使用用戶自定義函數對數組中的每一個元素作回調處理

array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ) : bool

array_walk_recursive — 對數組中的每一個成員遞歸地應用用戶函數

array_reduce — 用回調函數迭代地將數組簡化爲單一的值

array_replace_recursive — 使用傳遞的數組遞歸替換第一個數組的元素
複製代碼
3.其它
array_flip — 交換數組中的鍵和值
array_reverse — 返回單元順序相反的數組
array_column — 返回數組中指定的一列
array_combine — 建立一個數組,用一個數組的值做爲其鍵名,另外一個數組的值做爲其值

array_diff — 計算數組的差集
array_intersect — 計算數組的交集

array_filter — 用回調函數過濾數組中的單元
array_flip — 交換數組中的鍵和值

array_keys — 返回數組中部分的或全部的鍵名
array_values — 返回數組中全部的值

array_rand — 從數組中隨機取出一個或多個單元
shuffle — 打亂數組

array_product — 計算數組中全部值的乘積
array_sum — 對數組中全部值求和

array_search — 在數組中搜索給定的值,若是成功則返回首個相應的鍵名
array_key_exists — 檢查數組裏是否有指定的鍵名或索引
in_array — 檢查數組中是否存在某個值

array_replace — 使用傳遞的數組替換第一個數組的元素
array_slice — 從數組中取出一段
array_splice — 去掉數組中的某一部分並用其它值取代
複製代碼

PHP自帶的這些數組函數基本上你所想到的操做它都有,沒有的也能夠組合這些方法創造一個,我記得在laravel框架裏面就自帶了一個數組集合類,裏面就有一些很是好用的方法。ui

有人問,這麼多函數,怎麼能記住?spa

其實我以爲大部分時候並不要死記硬背,面試除外,當你遇到問題的時候至少內心有點數,具體參數能夠查下文檔,或者使用IDE的聯想功能,平時沒事多看看官方文檔也挺好的。指針

相關文章
相關標籤/搜索