PHP數組排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的適用場景與性能對比

在PHP開發中,數組排序是日常操作的核心技能之一。無論是處理用戶數據、產品列表,還是分析日志信息,合理的排序方法能顯著提升代碼的效率和可維護性。PHP提供了多種數組排序函數(如 sort()、rsort()、asort() 等),每種函數都有其獨特的用途和適用場景。本文將深入解析這些函數的原理、代碼示例及實際應用,并探討它們在項目中的性能表現。

一、PHP數組排序函數概述

PHP的數組排序函數可以分為以下幾類:

1. 按值排序

  1. sort():升序排序,重新索引鍵名。
  2. rsort():降序排序,重新索引鍵名。
  3. asort():升序排序,保留原始鍵名。
  4. arsort():降序排序,保留原始鍵名。

2. 按鍵排序

  1. ksort():按鍵名升序排序。
  2. krsort():按鍵名降序排序。

3. 自定義排序

  1. usort():通過自定義比較函數排序(適用于復雜數據結構)。
  2. uasort():保留鍵值關聯的自定義排序。
  3. uksort():按鍵名自定義排序。

二、核心函數詳解與代碼示例

1. sort() 與 rsort():簡單排序

用途:

  • 適用于數值或字符串數組的升序/降序排序。
  • 注意:會重置鍵名,適用于不需要保留原始鍵值的場景。
<?php// 序排序$numbers?= [5, 3, 8, 1];sort($numbers);print_r($numbers);// 輸出: [1, 3, 5, 8]// 混合類型排序$mixed?= ['apple', 'Banana', 'cherry'];sort($mixed); // 默認按字符串比較(ASCII碼)print_r($mixed);
// 輸出: ['Banana', 'apple', 'cherry']輸出結果:Array?( [0] => 1?[1] => 3?[2] => 5?[3] => 8?) Array?( [0] => Banana [1] => apple [2] => cherry )

2. asort() 與 arsort():保留鍵值關聯

用途:

  • 適用于關聯數組排序,需保留鍵名與值的對應關系。
  • 注意:鍵名不會被重置。
<?php
// 關聯數組升序排序$fruits?= ['a'?=> 'Apple', 'b'?=> 'Banana', 'c'?=> 'Cherry'];asort($fruits);print_r($fruits);// 輸出: ['a' => 'Apple', 'b' => 'Banana', 'c' => 'Cherry']// 多維關聯數組排序$users?= ['user1'?=> ['name'?=> 'Bob', 'age'?=> 30],'user2'?=> ['name'?=> 'Alice', 'age'?=> 25],'user3'?=> ['name'?=> 'Charlie', 'age'?=> 35]];// 按年齡升序排序uasort($users, function($a, $b) {return?$a['age'] <=> $b['age']; // PHP 7+ 結構化比較運算符});print_r($users);輸出結果:Array?( [a] => Apple [b] => Banana [c] => Cherry ) Array?( [user2] => Array?( [name] => Alice [age] => 25?) [user1] => Array?( [name] => Bob [age] => 30?) [user3] => Array?( [name] => Charlie [age] => 35?) )

3.ksort() 與 krsort():按鍵排序

用途:

  • 適用于按鍵名排序,常見于字典或配置文件。
  • 注意:鍵名必須為可比較類型(字符串或數字)。
<?php
// 按鍵名升序排序$config?= ['z'?=> 100, 'a'?=> 200, 'm'?=> 50];ksort($config);print_r($config);// 輸出: ['a' => 200, 'm' => 50, 'z' => 100]// 嵌套數組按鍵排序$menu?= ['contact'?=> ['title'?=> 'Contact Us'],'about'?=> ['title'?=> 'About Us'],'home'?=> ['title'?=> 'Home']];
ksort($menu); // 按鍵名排序菜單項
print_r($menu);輸出結果:Array?( [a] => 200?[m] => 50?[z] => 100?) Array?( [about] => Array?( [title] => About Us ) [contact] => Array?( [title] => Contact Us ) [home] => Array?( [title] => Home ) )

4.?usort():自定義排序

用途:

  1. 適用于復雜數據結構(如多維數組)或特殊排序規則。
  2. 注意:需定義比較函數,返回 -1、0 或 1。

<?php// 簡單示例:自定義排序(按字符串長度)$words?= ['apple', 'banana', 'pear'];usort($words, function($a, $b) {return?strlen($a) - strlen($b);});print_r($words);// 輸出: ['pear', 'apple', 'banana']// 復雜示例:多維數組按字段排序$products?= [['name'?=> 'Laptop', 'price'?=> 1200],['name'?=> 'Phone', 'price'?=> 800],['name'?=> 'Tablet', 'price'?=> 600]];// 按價格降序排序usort($products, function($a, $b) {return?$b['price'] <=> $a['price'];});print_r($products);輸出結果:Array?( [a] => Apple [b] => Banana [c] => Cherry ) Array?( [user2] => Array?( [name] => Alice [age] => 25?) [user1] => Array?( [name] => Bob [age] => 30?) [user3] => Array?( [name] => Charlie [age] => 35?) )

1.基準測試(以10000個元素為例):

函數

PHP 7.4 執行時間

PHP 8.1 執行時間

sort()

0.12秒

0.08秒

asort()

0.15秒

0.09秒

usort()

0.20秒

0.12秒


2.?適用場景總結

函數

適用場景

sort()

簡單數組排序,無需保留鍵名(如統計、臨時計算)。

asort()

關聯數組排序,需保留鍵值關系(如用戶數據、訂單信息)。

ksort()

按鍵名排序(如配置文件、菜單項)。

usort()

復雜數據結構排序(如多維數組、自定義規則)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80146.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabittMQ-高級特性2-應用問題

文章目錄 前言延遲隊列介紹ttl死信隊列存在問題延遲隊列插件安裝延遲插件使用事務消息分發概念介紹限流非公平分發&#xff08;負載均衡&#xff09; 限流負載均衡RabbitMQ應用問題-冪等性保障順序性保障介紹1順序性保障介紹2消息積壓總結 前言 延遲隊列介紹 延遲隊列(Delaye…

HOW - 在 Mac 上的 Chrome 瀏覽器中調試 Windows 場景下的前端頁面

文章目錄 為什么需要模擬 Windows 環境&#xff1f;一、修改 User-Agent 模擬 Windows 瀏覽器方法 1&#xff1a;通過 Chrome 開發者工具修改 UA方法 2&#xff1a;使用瀏覽器插件 二、模擬 Windows 的字體和滾動條樣式1. 模擬 Windows 字體2. 強制顯示滾動條&#xff08;模擬 …

如何刪除豆包本地大模型

由于無法選擇大模型的安裝位置&#xff0c;因此會占用C盤大量空間&#xff0c;然后又找到不卸載的地方&#xff0c;經排查豆包大模型安裝位為&#xff1a;C:\Users\[當前電腦用戶]\AppData\Local\Doubao\User Data&#xff0c;只能進行手動卸載。

Linux C語言線程編程入門筆記

目錄 開發環境準備 線程基礎概念 進程與線程的關系 線程生命周期 創建線程 等待線程結束 線程函數和參數 互斥鎖與共享資源保護 總結 開發環境準備 操作系統&#xff1a;以 Linux 為例&#xff08;Ubuntu/CentOS 等主流發行版&#xff09;。請確保系統已安裝 GNU C 編…

levelDB的數據查看(非常詳細)

起因:.net大作業天氣預報程序(WPF)答辯時&#xff0c;老師問怎么維持數據持久性的&#xff0c;啟動時加載的數據存在哪里&#xff0c;我明白老師想考的應該是json文件的解析&#xff08;正反&#xff09;&#xff0c;半天沒答上來存那個文件了&#xff08;老師默認這個文件是自…

數據分析怎么做?高效的數據分析方法有哪些?

目錄 一、數據分析的對象和目的 &#xff08;一&#xff09;數據分析的常見對象 &#xff08;二&#xff09;數據分析的目的 二、數據分析怎么做&#xff1f; &#xff08;一&#xff09;明確問題 &#xff08;二&#xff09;收集數據 &#xff08;三&#xff09;清洗和…

手寫 Vue 源碼 === 完善依賴追蹤與觸發更新

目錄 依賴收集的完整實現 trackEffects:建立雙向依賴關系 觸發更新的完整實現 完整的響應式流程 為什么使用 Map 而不是 Set? 總結 在上一篇文章中,我們介紹了 Vue3 響應式系統的基本原理和 activeEffect 的作用。現在,我們將深入探討完善后的依賴追蹤和觸發更新機制…

從代碼學習深度學習 - 區域卷積神經網絡(R-CNN)系列 PyTorch版

文章目錄 前言R-CNNFast R-CNN興趣區域匯聚層 (RoI Pooling)代碼示例:興趣區域匯聚層 (RoI Pooling) 的計算方法Faster R-CNNMask R-CNN雙線性插值 (Bilinear Interpolation) 與興趣區域對齊 (RoI Align)興趣區域對齊層的輸入輸出全卷積網絡 (FCN) 的作用掩碼輸出形狀總結前言…

18個國內wordpress主題推薦

工廠wordpress中文主題 紅藍色搭配的工廠wordpress中文主題&#xff0c;適合從事生產、加工的工廠官方網站使用。 https://www.jianzhanpress.com/?p8533 Pithy設計師wordpress網站模板 精練簡潔的wordpress模板&#xff0c;設計師或設計工作室展示型網站模板。 https://w…

低成本自動化改造技術錨點深度解析

執行摘要 本文旨在深入剖析四項關鍵的低成本自動化技術&#xff0c;這些技術為工業轉型提供了顯著的運營和經濟效益。文章將提供實用且深入的指導&#xff0c;涵蓋老舊設備聯網、AGV車隊優化、空壓機系統智能能耗管控以及此類項目投資回報率&#xff08;ROI&#xff09;的嚴謹…

Oracle — 數據管理

介紹 Oracle數據庫作為全球領先的關系型數據庫管理系統&#xff0c;其數據管理能力以高效性、安全性和智能化為核心。系統通過多維度技術實現海量數據的存儲與實時處理&#xff0c;支持高并發事務操作與復雜分析查詢&#xff0c;滿足企業關鍵業務需求。在安全領域&#xff0c;O…

【PhysUnits】3.3 SI 基礎量綱單位(units/base.rs)

一、源碼 這段代碼定義了一系列基礎物理量綱的類型別名&#xff0c;并使用標記 trait Canonical 來表示它們是國際單位制&#xff08;SI&#xff09;中的基本單位。 use crate::Dimension; use typenum::{P1, Z0};/// 標記特質&#xff0c;表示基礎量綱單位 pub trait Canoni…

硬件實操技巧記錄

本篇自用&#xff0c;防止自己忘記 焊接技巧 一般都是隨機電烙鐵錫膏組合。 拆電阻時&#xff0c;電烙鐵放在電阻上&#xff0c;加錫膏&#xff0c;這個時候熔點會降低&#xff0c;電阻更容易掉下來&#xff0c;用電烙鐵帶走&#xff1b;焊電阻時&#xff0c;一端點錫膏&…

13.thinkphp的Session和cookie

一&#xff0e;Session 1. 在使用Session之前&#xff0c;需要開啟初始化&#xff0c;在中間件文件middleware.php&#xff1b; // Session 初始化 \think\middleware\SessionInit::class 2. TP6.0不支持原生$_SESSION的獲取方式&#xff0c;也不支持session_開頭的函數&…

TensorFlow中數據集的創建

目錄 前言示例示例1示例2示例3示例4 前言 TensorFlow 的 tf.data.Dataset API 提供了一種靈活且高效的方式來加載和預處理數據。它可以輕松處理大規模數據集&#xff0c;并支持多種數據源格式。 所有數據集相關的內容都在tf.data中&#xff0c;from_tensor_slices&#xff1a;…

第十六章,網絡型攻擊防范技術

網絡攻擊介紹 網絡攻擊 --- 指的是入侵或破壞網絡上的服務器 ( 主機 ) &#xff0c;盜取服務器的敏感數據或占用網絡帶寬。 網絡攻擊分類&#xff1a; 流量型攻擊 網絡層攻擊 應用層攻擊 單包攻擊 畸形報文攻擊 --- 向目標主機發送有缺陷的IP報文&#xff0c;使得目標在…

服務器不備案有影響嗎

在當今數字化的時代&#xff0c;服務器成為了眾多企業和個人開展業務、展示自我的重要工具。然而&#xff0c;有一個問題常常被忽視&#xff0c;那就是服務器不備案到底有沒有影響&#xff1f; 答案是肯定的&#xff01;服務器不備案&#xff0c;影響可不小。據相關數據顯示&a…

【LeetCode Solutions】LeetCode 176 ~ 180 題解

CONTENTS LeetCode 176. 第二高的薪水&#xff08;SQL 中等&#xff09;LeetCode 177. 第 N 高的薪水&#xff08;SQL 中等&#xff09;LeetCode 178. 分數排名&#xff08;SQL 中等&#xff09;LeetCode 179. 最大數&#xff08;中等&#xff09;LeetCode 180. 連續出現的數字…

D720201 PCIE 轉USB HUB

1. 啟動時出現了下面錯誤 [ 4.682595] pcieport 0004:00:00.0: Signaling PME through PCIe PME interrupt [ 4.684939] pci 0004:01:00.0: Signaling PME through PCIe PME interrupt [ 4.691287] pci 0004:01:00.0: enabling device (0000 -> 0002) [ 5.2962…

【愚公系列】《Manus極簡入門》028-創業規劃顧問:“創業導航儀”

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…