目錄
PHP7.2 Data Structures 使用
1. 安裝
Array 缺點
介面類別
實作類別
首頁 後端開發 php教程 PHP7.2 Data Structures的使用

PHP7.2 Data Structures的使用

Jul 06, 2018 pm 03:11 PM
php

這篇文章主要介紹了關於PHP7.2 Data Structures的使用,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

PHP7.2 Data Structures 使用

1. 安裝

pecl install ds
登入後複製
brew install homebrew/php/php71-ds
登入後複製

目前PHP7.2不支援使用brew 安裝。

2. PHP 原始的資料結構Array

PHP5.x 的時代,Array是唯一的表示集合的資料類型,在PHP中,祂既是List 也是Map,祂是一切。

<?php $a = array(1,2,3,4);
$b = array(&#39;a&#39;=>1,'b'=>2,'c'=>3);
登入後複製

這種資料類型的確是為開發者帶來了便利性,但讓PHPer 會主鍵的忽略掉資料結構帶來的好處,特別是在學習其他的語言時,為PHPer 帶來困擾。

在 PHP 升級到7後,Array也同時得到了優化,但是他的結構並沒有發生變化, “optimised for everything; optimised for nothing”  with room for improvement。那如果我們可以透過引入更便利的資料結構來優化效能,同時寫程式碼反而更方便了,那何樂而不為呢?

「SPL資料結構怎麼樣?」
Unfortunately they are terrible. They did offer some benefits prior to PHP 7, but have since been neglected to the point of having no practical value.

「我們為什麼不能修正和改進它們?」
We could, but I believe their design and implementation is so poor that it would be better to replace them with something brand new.

“SPL數據結構的設計非常可怕。” - 安東尼費拉拉

Array 缺點

  • PHP 的Array 存取不存在的key 可以得到null,不會產生fatal error,但會有一個E_NOTICE。這個 E_NOTICE 會被 set_error_handler 註冊的函數截獲。顯然,這種程式碼上的不乾淨和效能上的無謂開銷完全是可以避免的。

<?php $a = [];
$a[&#39;a&#39;]; // PHP Notice:  Undefined offset
登入後複製

一般的 PHPer 都不會用array_key_exists 和 if else 來處理,這樣做會顯得有些麻煩。

  • 有時候Array 的使用,效能會變得很差。 Array 本質上是一個 Map,unshift 一個元素進來,將會改變每個元素的 key,這是一個 O(n)運算。另外,PHP 的 Array 將其 value(包括 key 和 它的 hash) 保存在一個 bucket 中,所以我們需要查看每一個 bucket 並更新 hash。

PHP 內部其實是透過建立新的 array 來完成 array_unshift 操作的,其效能問題可想可知。

DataStructures,PHP7的一個擴展,數組(Array)的一個替代品。

Github: https://github.com/php-ds

#Namespace: Ds\

介面類別: Collection, Sequence, Hashable

實作類別(final class): Vector, Deque, Map, Set, Stack, Queue, PriorityQueue, Pair

PHP7.2 Data Structures的使用

介面類別

  • Collection 是一個基礎接口,定義了一個資料集合(這裡的集合指的是Collection,不是Set) 的基本運算,如foreach, echo, count, print_r,  var_dump, serialize, json_encode, and clone.等。

  • Sequence 是類別數組資料結構的基礎接口,定義了很多重要且方便的方法,例如 contains, map, filter, reduce, find, first, last 等。從圖中可知,Vector, Deque, Stack, Queue 都直接或間接的實作了這個介面。它的特徵如下:

    • 值總是會被索引[0, 1, 2, …, size - 1]

    • 刪除或插入更新所有連續值的位置。

    • 只允許存取索引在 [0, size-1]的值。

  • Hashable 在圖中看起來比較孤立,但對 Map 和 Set 很重要。一個 Object 如果實作了 Hashable,就可以當作 Map 的 key,可以當作 Set 的元素。這樣 Map 和 Set 就能像 Java 一樣方便的使用了。

實作類別

  • Vector 應該是最常用的資料結構之一了,可以把它當成 Ruby 的 Array 或 Python 的 List。其元素的值的 index 就是它在 buffer 中的 index,所以效率很高。只要有使用陣列的需求且不需要 insert, remove, shift 和 unshift 的都可以用它。

影片說明

  • PhotoShop中使用主要的資料結構就是Vector  ---- Sean Parent
    • insert, remove, shift,  and unshift 的複雜度為O(n)

    • 低記憶體使用量

    • get, set , push and pop的複雜度為O(1)

    • 優點:

    • 缺點:

    • #Deque(發音[dek] ) 是一種雙端隊列「double-ended queue」。在 queue 的基礎上增加了一個頭指針,因此 shift 和 unshift 也是 O(1) 複雜度了。但帶來的性能損耗並不多。

    兩個指標用於追蹤頭部和尾部, 指標可以「wrap around」緩衝區的末尾,這避免了需要移動其他值來騰出空間。這使得移位和移位非常快 - Vector無法與之競爭。影片說明

    • inser,remove 的複雜度為 O(n)。

    • 緩衝區容量必須是2的n次方。

    • 低記憶體使用量。

    • get,set, push, pop, shift, and unshift 的複雜度為 O(1)。

    • 優點:

    • 缺點:

    • Stack 是一種「LIFO」 結構,依照「後進先出」的原則允許存取、遍歷、銷毀結構頂部的值。 DsStack 的內部使用的是 DsVector 的實作。

    • Queue 是一種「FIFO」結構,依照「先進先出」的原則允許存取、遍歷、銷毀結構頂部的值。 DsQueue 內部使用的是 DsDeque 的實作。

    • PriorityQueue(優先權佇列) 與 Queue 非常的相似,依照指派的優先權將值推入佇列,優先權最高的值總是位於佇列的前端。遍歷 PriorityQueue 具有破壞性,相當於連續的彈出操作,直到佇列為空。 使用最大堆實作

    • Hashable , 一個允許用物件作鍵的介面。注意:並不是hashTable。 Hashable只引進了兩種方法:hash和equals。支援Hashable介面的資料結構是Map和Set。

    • Map , 一種連續的鍵值對集合。同 array 的使用是一致的,key 可是是任意的類型,但是必須唯一。如果相同的 key 加入到 Map 中,那麼就會替換掉原有的。就像array 一樣,插入的順序會被保留。

      • 當key 為物件時,不能轉換成 Array 。

      • 效率和記憶體使用幾乎和Array 一致

      • 當Map 的大小下降到足夠小時,會自動釋放已分配的記憶體。

      • key 和 value 可以是任意類型,甚至是物件。

      • put, get, remove, 和hasKey 的複雜度為O(1)

      • 優點:

      • 缺點:

    • Set,是一個無序唯一值的集合。 Map 內部使用了 set 的實現,他們都是基於Array 相同的內部結構,這意味著這Set 的排序具有 O(n*log n) 的複雜度。

      • 不支援push, pop, insert, shift, unshift

      • 如果在索引之前刪除了值,那麼複雜度會從O(1) 降到O(n)

      • 新增、刪除、引用都是O(1)的複雜度

      • #使用Hashable 的介面

      • 支援任何類型的值。

      • 優點:

      • # 缺點:

    這裡在說明一點,Array中的值本身是沒有索引的,因此在使用in_array()的時候呈線性搜索,複雜度為O(n)。
    如果想要建立一個唯一值數組,可以使用array_unique(),由於array_unique()針對的是value 而不是key,所以每個數組成員都會被限行搜索,複雜度會變成O(n²)。

    以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

    相關推薦:

    php編譯安裝擴充redis及swoole的方法

以上是PHP7.2 Data Structures的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

See all articles