PHP語法基礎篇(六):數組

PHP 中的數組實際上是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型針對多種不同用途進行了優化;它可以被視為數組、列表(向量)、哈希表(映射的實現)、字典、集合、堆棧、隊列等等。本篇文章將記錄數組的學習過程。

一、創建數組

二、訪問數組

1、數組解包

2、遍歷數組

三、操作數組

1、添加數組項

2、修改數組項

2.1、在 foreach 循環中修改數組項

3、刪除數組項?

四、多維數組

1、二維數組?

五、數組函數


一、創建數組

可以用 array() 語言結構來新建一個 array。它接受任意數量用逗號分隔的 鍵(key) => 值(value) 對。

array(key  => value,key2 => value2,key3 => value3,...
)

鍵(key)不是必需的,最后一個數組單元之后的逗號可以省略。

可以用短數組語法 [] 替代 array() 。

?示例 一個簡單的數組

$array = array("foo" => "bar","bar" => "foo",
);// 使用短數組語法
$array = ["foo" => "bar","bar" => "foo",
];

?鍵(key)可以是 integer 或者 string。value 可以是任意類型。

此外 key 會有如下的強制轉換:

  • String 中包含有效的十進制 int,除非數字前面有一個 + 號,否則將被轉換為 int 類型。例如鍵名 "8" 實際會被儲存為 8。另外, "08" 不會被強制轉換,因為它不是一個有效的十進制整數。
  • Float 也會被轉換為 int ,意味著其小數部分會被舍去。例如鍵名 8.7 實際會被儲存為 8。
  • Bool 也會被轉換成 int。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0。
  • Null 會被轉換為空字符串,即鍵名 null 實際會被儲存為 ""。
  • Array 和 object 不能被用為鍵名。堅持這么做會導致警告:Illegal offset type。

如果在數組定義時多個元素都使用相同鍵名,那么只有最后一個會被使用。

示例 類型轉換與覆蓋

$array = array(1    => "a","1"  => "b",1.5  => "c",true => "d",
);
var_dump($array);

輸出

array (size=1)1 => string 'd' (length=1)

上述示例中所有的鍵名都被強制轉換為 1,則每一個新單元都會覆蓋前一個的值,最后剩下的只有一個 "d"。

PHP 數組可以同時含有 int 和 string 類型的鍵名,因為 PHP 實際并不區分索引數組和關聯數組。

PHP 數組可以同時含有 int 和 string 類型的鍵名,因為 PHP 實際并不區分索引數組和關聯數組。

索引數組:在索引數組中,每個項目都有一個索引號。默認情況下,第一個項目的索引是 0,第二個項目的索引是 1,依此類推。(Java中的數組就屬于索引數組)

關聯數組:是使用分配給它們的命名鍵的數組。(類似Java中的Map)

PHP 中的數組和其它編程語言中的數組并不完全一樣,這一點需要注意。

示例 混合 int 和 string 鍵名的數組?

$array = array("foo" => "bar","bar" => "foo",1   => -1,-1  => 1,
);
var_dump($array);

輸出

array (size=4)'foo' => string 'bar' (length=3)'bar' => string 'foo' (length=3)1 => int -1-1 => int 1

key 為可選項。如果未指定,PHP 將自動使用之前用過的最大 int 鍵名加上 1 作為新的鍵名。

接下來看一個不使用鍵名的示例,此時創建的數組就是一個索引數組。

$array = array("a", "b", "c", "d");
var_dump($array);

輸出

array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)2 => string 'c' (length=1)3 => string 'd' (length=1)

還可以對某些單元指定鍵名,而其它位置為空,沒有鍵名。

$array = array("a","b",6 => "c","d",
);
var_dump($array);

輸出

array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)6 => string 'c' (length=1)7 => string 'd' (length=1)

可以看到最后一個值 "d" 被自動賦予了鍵名 7。這是由于之前最大的整數鍵名是 6。


二、訪問數組

數組單元可以通過 array[key](數組名[鍵名]) 來訪問。

$arr = array("Hello, World","foo" => "bar","a",
);
var_dump($arr[0]);
var_dump($arr["foo"]);
var_dump($arr[1]);

?輸出

string 'Hello, World' (length=12)
string 'bar' (length=3)
string 'a' (length=1)

試圖訪問一個未定義的數組鍵名與訪問任何未定義變量一樣:會導致 E_WARNING 級別錯誤信息(在 PHP 8.0.0 之前是 E_NOTICE 級別),其結果為 null。

?如果要獲取數組中元素的個數,可以使用 count() 函數。count()?函數用于計算數組中元素的數量。

$arr1 = ["a", "b", "c"];
$arr2 = ["a" => 1, "b" => 1];echo count($arr1); // 輸出 "3"
echo "<br>";
echo count($arr2); // 輸出 "2"

1、數組解包

可以使用 [](自 PHP 7.1.0 起)語言結構解包數組。這些結構可用于將數組解包為不同的變量。

$source_array = ['a', 'b', 'c'];
[$a, $b, $c] = $source_array;echo $a . "<br>";    // 輸出 "a"
echo $b . "<br>";    // 輸出 "b"
echo $c . "<br>";    // 輸出 "c"

如果變量未提供,數組元素將會被忽略。數組解包始終從索引 0 開始。

$source_array = ['a', 'b', 'c'];
// 將索引 2 的元素分配給變量 $c
[, , $c] = $source_array;echo $c;    // 輸出 "c"

自 PHP 7.1.0 起,也可以解包關聯數組。這在數字索引數組中更容易選擇正確的元素,因為可以顯式指定索引。

$source_array = ['a' => 1, 'b' => 2, 'c' => 3];
// 將索引 'c' 處的元素分配給變量 $three
['c' => $three] = $source_array;
echo $three;    // 輸出 "3"echo "<br>";$source_array = ['a', 'b', 'c'];
// 將索引 2 處的元素分配給變量 $c
[2 => $c] = $source_array;
echo $c;    // 輸出 "c"

數組解包也可用于兩個變量交換。

$a = 1;
$b = 2;[$b, $a] = [$a, $b];echo $a;    // 輸出 "2"
echo "<br>";
echo $b;    // 輸出 "1"

2、遍歷數組

使用 foreach 對數組進行遍歷。

語法

foreach (iterable_expression as $value) {// 代碼段
}foreach (iterable_expression as $key => $value) {// 代碼段
}

第一種格式遍歷給定的 iterable_expression 迭代器。每次循環中,當前單元的值被賦給 $value。該遍歷方式用于索引數組。

第二種格式做同樣的事,只除了當前單元的鍵名也會在每次循環中被賦給變量 $key。該遍歷方式用于關聯數組。

示例 foreach 遍歷索引數組

$arr = ["a", "b", "c", "d"];
foreach($arr as $value) {echo $value . "<br>";
}
/* 輸出abcd
*/

示例 foreach 遍歷關聯數組

$arr = ['a' => 1, 'b' => 2, 'c' => 3];
foreach($arr as $key => $value) {echo $key . ":" . $value . "<br>";
}
/* 輸出a:1b:2c:3
*/

三、操作數組

1、添加數組項

使用括號 [] 語法向現有數組中添加項(用于索引數組)。

$arr = ["a", "b", "c"];
$arr[] = ["d"];
var_dump($arr);

還可以使用 數組名[鍵名]=值 的方式向數組中添加項,如果鍵名在數組中已經存在,則會更改該鍵名對應的值。

$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["d"] = 4;
var_dump($arr);

使用?array_push()?函數可以向現有數組中添加多個項(用于索引數組)。

$arr = ["a", "b", "c"];
array_push($arr, "d", "e", "f");
var_dump($arr);

要向關聯數組中添加多個項,可以使用 += 運算符。

$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr += ["d" => 4, "e" => 5];
var_dump($arr);

2、修改數組項

要修改現有的數組項,對于索引數組,可以引用索引號;對于關聯數組,可以引用鍵名。

示例 更改索引數組指定項的值

// 將數組第二項,即索引為 1 的項的值改為 "B"
$arr = ["a", "b", "c"];
$arr[1] = "B";
var_dump($arr);

示例 更改關聯數組指定鍵名的值

// 將鍵名 "b" 的值更改為 "二"
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["b"] = "二";
var_dump($arr);

2.1、在 foreach 循環中修改數組項

通過在 $value 之前加上 & 來修改數組的元素。此方法將以引用賦值而不是拷貝一個值。

$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {$value = $value * 2;
}
// 現在 $arr 是 array[2, 4, 6, 8]
unset($value); // 最后取消掉引用
var_dump($arr);

注意:數組最后一個元素的 $value 引用在 foreach 循環之后仍會保留。建議使用 unset() 來將其銷毀。

3、刪除數組項?

使用?unset()?函數來刪除現有的數組項。該函數接受無限數量的參數,因此可用于刪除多個數組項。

$arr = ["a", "b", "c", "d", "e", "f"];
unset($arr[1]); // 刪除1項
unset($arr[3], $arr[4]); // 刪除多項
var_dump($arr);$phones = array("brand" => "Vivo", "price" => 1999, "color" => "red");
unset($phones["price"]); // 刪除關聯數組中指定鍵名項
var_dump($phones);

輸出

array (size=3)0 => string 'a' (length=1)2 => string 'c' (length=1)5 => string 'f' (length=1)
array (size=2)'brand' => string 'Vivo' (length=4)'color' => string 'red' (length=3)

注意:unset()?函數不會重新排列索引,這意味著在刪除后,數組將不再包含缺失的索引。

?使用 array_pop()?函數刪除數組的最后一項。

$arr = ["a", "b", "c", "d", "e", "f"];
array_pop($arr);
var_dump($arr);

使用?array_shift()?函數刪除數組的第一項。

$arr = ["a", "b", "c", "d", "e", "f"];
array_shift($arr);
var_dump($arr);

四、多維數組

多維數組是一個包含一個或多個數組的數組,PHP 支持深度為二、三、四、五或更多層的多維數組。

數組的維度表示選擇元素所需的索引數量。
  • 對于二維數組,需要兩個索引來選擇元素
  • 對于三維數組,需要三個索引來選擇元素

本篇文章只對二維數組進行說明。

1、二維數組?

二維數組是數組的數組,我們通常使用它來保存表格數據。

首先,來看下面的表格:

手機品牌

庫存

價格

華為

200

1999

小米

350

1599

Vivo

103

1799

我們可以將上表中的數據存儲在二維數組中,如下所示:

$phones = [["華為", 200, 1999],["小米", 350, 1599],["Vivo", 103, 1799]
];

現在二維的 $phones 數組包含四個數組,并且它有兩個索引:行和列(索引都是從 0 開始)。

要訪問 $phones 數組的元素,我們必須指向兩個索引(行和列):

echo $phones[0][0] . ":庫存:" . $phones[0][1] . ",價格:" . $phones[0][2] . "<br>";
echo $phones[1][0] . ":庫存:" . $phones[1][1] . ",價格:" . $phones[1][2] . "<br>";
echo $phones[2][0] . ":庫存:" . $phones[2][1] . ",價格:" . $phones[2][2] . "<br>";

還可將數組解包用于 foreach 在迭代多維數組時對其進行解包。

foreach ($phones as [$brand, $inventory, $price]) {echo $brand . ":庫存:" . $inventory . ",價格:" . $price . "<br>";
}

五、數組函數

PHP 提供了一組內置函數,可用于操作數組。該函數內容過多,就不在文章中一一進行記錄了,這里記錄下數組函數的文檔地址,方便以后使用時查閱。文檔地址:數組函數官方文檔。

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

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

相關文章

GitHub Actions 的深度解析與概念介紹

GitHub Actions 核心定義 Git Actions 是 GitHub 原生提供的 自動化工作流引擎&#xff0c;允許開發者在代碼倉庫中直接創建、測試、部署代碼。其本質是通過事件驅動&#xff08;Event-Driven&#xff09;的自動化管道&#xff0c;將軟件開發中的重復任務抽象為可編排的流程。…

TestCafe 全解析:免費開源的 E2E 測試解決方案實戰指南

在2025年的數字化浪潮中&#xff0c;Web應用的穩定性和用戶體驗成為企業競爭的關鍵&#xff0c;而端到端&#xff08;E2E&#xff09;測試則是確保質量的“守護者”&#xff01;想象一下&#xff0c;您的電商平臺因表單錯誤導致用戶流失&#xff0c;或者支付流程因瀏覽器兼容性…

[CVPR 2025] 高效無監督Prompt與偏好對齊驅動的半監督醫學分割

CVPR 2025 | 優化SAM&#xff1a;高效無監督Prompt與偏好對齊驅動的半監督醫學分割 論文信息 標題&#xff1a;Enhancing SAM with Efficient Prompting and Preference Optimization for Semi-supervised Medical Image Segmentation作者&#xff1a;Aishik Konwer, Zhijian…

【C++】責任鏈模式

目錄 一、模式核心概念與結構二、C++ 實現示例:員工請假審批系統三、責任鏈模式的關鍵特性四、應用場景五、責任鏈模式與其他設計模式的關系六、C++ 標準庫中的責任鏈模式應用七、優缺點分析八、實戰案例:Web 請求過濾器鏈九、實現注意事項如果這篇文章對你有所幫助,渴望獲得…

dp進階,樹形背包(dfs+01)

顧名思義&#xff0c;就是在對樹進行搜索的時候&#xff0c;由于限制了子節點選根節點必選和節點數限制&#xff0c;所以需要額外利用背包來維護最大值 假設根節點就是0&#xff0c;我們很容易 發現&#xff0c;這就是一個正常的樹求和&#xff0c;但是限制了節點數量&#xf…

微信小程序安卓手機輸入框文字飄出輸入框

最近在開發微信小程序遇到一個問題&#xff0c;安卓手機輸入框文字飄出輸入框&#xff0c;但是ios系統的手機則正常。 使用情景&#xff1a;做了一個彈窗&#xff0c;彈窗內是表單&#xff0c;需要填寫一些信息&#xff0c;但是在填寫信息時光標不顯示&#xff0c;輸入的內容飄…

3 大語言模型預訓練數據-3.2 數據處理-3.2.2 冗余去除——3.后綴數組(Suffix Array)在大模型數據去重中的原理與實戰

后綴數組&#xff08;Suffix Array&#xff09;在大模型數據去重中的原理與實戰 一、后綴數組的核心原理與數據結構二、后綴數組去重的核心流程1. **文檔預處理與合并**2. **構建后綴數組**3. **計算最長公共前綴&#xff08;LCP&#xff09;數組**4. **基于LCP檢測重復文檔** …

數據庫外連接詳解:方式、差異與關鍵注意事項

&#x1f504; 數據庫外連接詳解&#xff1a;方式、差異與關鍵注意事項 外連接用于保留至少一個表的全部行&#xff0c;即使另一表無匹配記錄。以下是三種外連接方式的深度解析&#xff1a; &#x1f50d; 一、外連接的三種類型 1. 左外連接 (LEFT OUTER JOIN) 作用&#xf…

vscode把less文件生成css文件配置,設置生成自定義文件名稱和路徑

1.下載less插件 在插件市場搜索 less 2.設置生成配置 3.修改out屬性 "less.compile": {"compress": false, // 是否刪除多余空白字符 一行顯示[壓縮]"sourceMap": false, // 是否創建文件目錄樹&#xff0c;true的話會自動生成一個 .css.map …

探索相機成像的奧秘 - 齊次坐標、徑向失真和圖像傳感器傾斜

引言 大家好&#xff01;今天我們將一起探索相機成像背后的一些關鍵技術概念&#xff1a;齊次坐標、徑向失真和圖像傳感器傾斜。這些概念對于理解相機如何捕捉和處理圖像至關重要。我們將通過簡單易懂的語言和嚴謹的公式來詳細解釋這些概念。 齊次坐標&#xff08;Homogeneou…

校企協同育人,智慧養老實訓基地助力人才就業無憂

隨著我國人口老齡化程度不斷加深&#xff0c;智慧養老產業蓬勃發展&#xff0c;對專業人才的需求日益迫切。校企協同打造智慧養老實訓基地&#xff0c;成為解決人才供需矛盾、提升人才培養質量的重要途徑。通過科學的建設方案&#xff0c;智慧養老實訓基地能夠為學生提供實踐平…

從需求到落地:一個AI訓練平臺的售前全流程復盤

目錄 一、項目背景:客戶要建自己的AI訓練平臺 二、需求梳理三板斧:并發量、存儲帶寬、模型種類 1. 并發訓練量 2. 存儲帶寬需求 3. 模型類型與參數規模 三、解決方案設計:GPU選型 + 高速網絡 + 存儲架構 ? GPU服務器選型 ? 網絡與通信架構 ? 存儲與數據緩存 四…

織夢DedeCMS轉WordPress

最近&#xff0c;有個用戶找模板兔遷移網站&#xff0c;源站用的dede&#xff0c;需要轉成wp&#xff0c;文章數量大概7000-8000篇&#xff0c;其中有個需求是保證舊文章的鏈接有效&#xff0c;在wp上的新文章與舊文章的鏈接類型不一樣&#xff0c;所以這涉及到偽靜態來處理跳轉…

installGo.sh

#!/bin/bash # 檢查是否以root用戶運行 if [ "$(id -u)" -ne 0 ]; then echo "請使用root權限運行此腳本" exit 1 fi # 檢查是否安裝了必要的工具 for cmd in curl wget tar; do if ! command -v $cmd &> /dev/null; then echo…

【技術難題】el-table的全局數據排序實現示例,不受分頁影響,以及異步請求帶來的頁面渲染問題

參考鏈接:https://blog.csdn.net/qq_35770559/article/details/131183121 問題代碼 編輯頁面detail.vue <el-form title="列表信息" name="detail"><el-form><el-form-item><el-buttontype="cyan"icon="el-icon-p…

非功能測試

非功能測試范疇&#xff1a;界面測試&#xff0c;易用性測試&#xff0c;兼容性測試&#xff0c;文檔測試&#xff0c;安裝/卸載測試等等 界面測試 1.窗體界面測試 1.窗體定義&#xff1a;指整個軟件窗口&#xff0c;也可稱為窗口&#xff0c;是界面測試的基本單位 2.控件分…

一起endpoint迷路的問題排查總結

今天上班&#xff0c;一到工位上&#xff0c;就有同事和我說有客戶反映自己的容器的一些指標在監控平臺不上報了&#xff0c;我當時一看機器所在的監控&#xff0c;發現確實是這樣 確實存在某個點開始數據就沒了&#xff0c;主要這個點當時也沒有任何的操作變更&#xff0c;于…

官方 Linker Scripts 語法和規則解析(2)

系列文章目錄 官方 Linker Scripts 語法和規則解析&#xff08;1&#xff09; 官方 Linker Scripts 語法和規則解析&#xff08;2&#xff09; 官方 Linker Scripts 語法和規則解析&#xff08;3&#xff09; 鏈接腳本(Linker Scripts)語法和規則解析(自官方手冊) 7.9. 鏈接腳…

CentOS 7 通過YUM安裝MySQL 8.0完整指南

一、準備工作&#xff1a;更新系統與YUM源 # 1. 更換阿里云鏡像源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 2. 清理并重建緩存 yum clean all yum makecache# 3. 升級系統所有包 yum -y update 二、安裝MySQL 8.0 1. 下載…

qq郵箱 新版 怎么去掉個性簽名?

qq郵箱 新版 怎么去掉個性簽名&#xff1f; 新版的qq郵箱&#xff0c;用著還不錯&#xff0c;特別是搜索&#xff0c;比以前好多&#xff0c;以前加載的時候&#xff0c;搜索框里有一行字&#xff0c;加載不完&#xff0c;就沒法搜索&#xff0c;特別菜。現在好多了。 不過現在…