本文目錄一覽:
PHP 數組的底層實現
PHP 數組的底層主要是通過 HashTable 實現,HashTable 通過映射函數或者散列函數將 String Key 轉換成一個普通的數字下標,然後再將 Value 值存儲到下標對應的數組元素中
HashTable 主要包含兩部分:1.存儲元素的數組 2.散列函數或者映射函數
隨機訪問
如果我們指定一個 Key=Value 的映射關係,Key 是一個 String 類型的,則先通過 Time 33 算法將 String 轉換成一個 Int 整型,然後再通過 PHP 裡面特定的散列算法映射成 Bucket 數組中的一個下標,將 Value 值存儲到對應的下標元素中,當我們通過 Key 訪問數組元素時,只需要再通過相同的算法計算出對應的 Key,就能實現隨機訪問數組元素
順序訪問
存儲在 HashTable 中的數組是無序的,但是 PHP 中的數組是有序的,為了實現 HashTable 的有序性,PHP 引入了一個中間映射表,該表是一個大小和 Bucket 數組相同的數組,數組中存放的是整形數據,主要用於存放元素實際存儲的 Value 的下標值,當引入中間映射表之後,Bucket 中的數據是有序的,而中間映射表中的數據是無序的,當我們順序訪問的時候只需要遍歷 Bucket 中的數據即可
Hash 衝突
PHP 解決 Hash 衝突採用的是鏈地址法,將出現衝突的 Bucket 串成鏈表,這樣通過中間映射表映射出來的就不再是一個元素而是一個鏈表,通過散列函數定位到對應的 Bucket 鏈表時,需要遍歷鏈表,逐個對比 key 值,直至找出對應的目標值
PHP 實現擴容
1.當刪除的元素所佔比例超出閾值的時候,則需要移除已經被邏輯刪除的 Bucket,將後面的 Bucket 補位到前面,因為 Bucket 的下標發生了變動,所以需要更新每元素在中間映射表中實際存儲的下標值
2.當沒有超出閾值的時候,PHP 會申請一個大小是原來兩倍的新數組,並將舊數組中的數據複製到新數組中,因為數組長度發生了變化,所以 key-value 的映射關係需要重新計算,這個就是重建索引
php怎麼把關聯數組轉成索引數組?
PHP和PERL、VB不同,其只有“數組”,沒有單獨的“關聯數組”類型,實際上PHP的所有數組都是關聯數組,當沒有指定鍵值的時候,鍵值為0、1、2??
php中定義數組的方法:
PHP定義數組的格式
數組名=array();
如:$aa=array();//這樣就定義了一個數組,
之後給元素賦值:
$aa[0]=”9016″;
$aa[1]=”9017″;
$aa[2]=”9018″;
PHP輸出數組的方法:
foreach($aa as $val)
{echo$val;}
也可以在定義數組時直接賦值
$aa=array(0=”9016″,1=”9017″;2=”9018″);
PHP的數組還可以用字符做下標,不一定要數字.
$aa[“name”]=”Joan”;
$aa[“num”]=”9018″;
$aa[“email”]=”abc@abc.com”;
也可以這樣
$aa=array(“name”=”joan”,”num”=”9018″,”email”=”abc@abc.com”);
將一個一維數組的元素也定義為數組,就是一個二維數組,
$aa=array(0=”a1″,1=”a2″);
$bb=array(0=”b1″,1=”b2″);
$cc=array(0=$aa;1=$bb);此時,$cc[0]也是一個數組,$cc[1]也是一個數組,$cc就是一個二維數組。
同理,三維,四維數組也可以繼續定義下去。
數組的元素不僅於數字和字符串,可以是類的對象。
PHP重置索引
為什麼$array = array_values($array);後再打印出來的索引就是從0開始的
array_values()不是獲取數組的值嗎 跟重置索引有什麼關係
===================
是獲取數組的值,而且拋棄原數組的索引,重建一個數組.所以相當於重置索引.
php刪除數組指定元素並重建索引
mongodb中使用aggregate可以返回數組字段數組的指定索引的元素
參考語句:
{$match:{‘duid’:15}},
{$project:{duid:1,”default”:1}},
{$unwind:”$default.styles”},
{$match:{‘default.styles.status’:1}},
{$group:{_id:”$_id”,”defaults”:{$push:”$default.styles”}}}
解釋:
1:過濾數據{$match:{‘duid’:15}}
2:獲取想要的列{$project:{duid:1,”default”:1}}
3:獲取展開後數組字段{$unwind:”$default.styles”}
4:條件查詢數組元素{$match:{‘default.styles.status’:1}}
5:分組後保存結果{$group:{_id:”$_id”,”defaults”:{$push:”$default.styles”}}}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/237920.html