PHP基礎教程八之數組

本節講解內容

  • 數組的介紹
  • 數組的創建
  • 數組的動態增長
  • 數組的遍歷
  • 數組的相關函數
  • 數組運算符

前言

在前面我們所學的不管是變量和常量,都是一個個單個的數據,而有時候我們有這樣的需求,需要把一些相同類型的數值或一些不相干的數值,合理的存儲起來,而用到的時候可以按照某種規則取出數據。這時候前面的變量等就不能滿足要求,在這裏就是用到數組。

數組的介紹

PHP中的數組和別的語言的數組不一樣,這也是PHP語言語法的鬆散性造成的。那有什麼不一樣?

所謂數組,就是相同數據類型或不同的數據類型元素按一定順序排列的集合,就是把有限個變量用一個名字命名,然後用編號區分他們的變量的集合,這個名字稱爲數組名,編號稱爲下標。組成數組的各個變量稱爲數組的分量,也稱爲數組的元素,有時也稱爲下標變量。

數組的定義通俗的理解就是存放數據的集合,

<?php

    //定義一個數組,裏面存放的數據類型可以任意類型
    $arr = array(12,true,false,'abcd',12.2);
    print_r($arr);//輸出數組。
.....結果......
Array ( [0] => 12 [1] => 1 [2] => [3] => abcd [4] => 12.2 )

可以看到在數組中存放各種數據類型,在輸出的時候都可以進行輸出。並且可以看到在輸出的時候,每個數值都有一個下標於之對應,這個下標就稱之爲鍵(key),而數值是值(value),我們在想取某個值得時候可以通過鍵來取。

$a = 數組名[鍵名]
echo $arr[0];
.....結果......
12

當數組的鍵值是數字的時候,它的下標是從0開始計算的。

那麼數組的怎麼創建的呢?

數組創建的三種方式

  • 索引數組(下標是數字的)在PHP中定義數組的方式有三種。
  • 關聯數組(下標是字符串)
  • 數組的下標兩者都有。

第一種

<?php

    //定義數組,數值用逗號隔開。
    $arr = array(1,2,3,4,'abcd',true);
    print_r($arr);
.....結果......
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => abcd [5] => 1 )

用 array() 語言結構來新建一個數組,從輸出結果中可以看到下標是數字。而取數據也是通過數字下標來取的。這就是索引數組。

第二種

<?php

    //關聯數組,自己定義下標,用=>來定義鍵和值
    $arr = array('a' => 1,'b' => 2,'c' => 'abcde', 'd' => true);
    print_r($arr);
.....結果......
Array ( [a] => 1 [b] => 2 [c] => abcde [d] => 1 )

這種方法也是用array()語法結構來定義的,但是數組的下標是我們自己定義的,這裏可以根據自己的情況自己定義下標。關於鍵值得定義需要注意,key 會有如下的強制轉換

  1. 包含有合法整型值的字符串會被轉換爲整型。例如鍵名 “8” 實際會被儲存爲 8。但是 “08” 則不會強制轉換,因爲其不是一個合法的十進制數值。
  2. 浮點數也會被轉換爲整型,意味着其小數部分會被捨去。例如鍵名 8.7 實際會被儲存爲 8。
  3. 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存爲 1 而鍵名 false 會被儲存爲 0。
  4. Null 會被轉換爲空字符串,即鍵名 null 實際會被儲存爲 “”。
  5. 數組和對象不能被用爲鍵名。堅持這麼做會導致警告:Illegal offset type。

如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了。

取關聯數組中的值需要使用自己定義的鍵來取。

第三種

<?php

    $arr[0] = 1;
    $arr[2] = 2;
    $arr['a'] = 12;
    $arr[4] = 45;

    print_r($arr); 
.....結果......
Array ( [0] => 1 [2] => 2 [a] => 12 [4] => 45 )

第三種數組的定義可以直接用方括號進行定義,系統會默認的認爲這是一個數組,並進行創建。至於下標你可以使用數字或者字符串。但是如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了。

數組的動態增長

PHP的數組的長度是一個不固定的,當你填完數據時候,你還是可以進行填寫數據的,同時數組的長度也會跟着增加,這就是php數組的動態增長。

<?php

    for($i = 0; $i < 10; $i++){
        $arr[] = $i;
    }
    print_r($arr);
......結果.......
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 )

上面的代碼利用一個for循環,使用數組的第三種定義方式進行賦值,但是可以看到我們並沒有在數組的方括號裏面寫下標,但是程序並沒有報錯,這是因爲數組的動態增長。如果未指定key的值,PHP 將自動使用之前用過的最大 integer 鍵名加上 1 作爲新的鍵名。因此,在輸出結果中可以看到下標是從0開始自動增長的。

數組的遍歷

前面我們介紹了數組的創建和基本的使用,那麼怎麼從數組中全部的取出裏面的值?在PHP中,可以使用循環控制流程取到數組中的值,通過循環遍歷數組來逐個得到裏面的值。

for

在數組的遍歷中可以使用for來的到數組裏面的值。

<?php

    $arr = array(1,9,4,2,8,10,5);
    $sum = count($arr);
    for($i = 0; $i < $sum; $i++){
        echo $arr[$i] . '  ';
    }
.....結果......
1 9 4 2 8 10 5

上面的count()這個系統函數是統計一個數組裏的所有元素,或者一個對象裏的東西。從而的到數組的大小,也就是長度。然後通過for循環,把$i當做數組的下標($i從0開始)。

foreach

在上面的代碼中如果我們的數組是關聯數組,也就是數組的下標是一個字符串,那麼上面的代碼是不可能取出來。所以我們可以使用PHP提供的另外一種循環方法:foreach()。它的語法有兩種:

foreach(數組名 as $key => $value){

}

foreach(數組名 as $value){

}

其中“as”是一個關鍵字,不能變。

foreach裏面有可以有三個參數,第一個參數是數組的名字,第二個參數key value是用來存儲從數組中取出來的值。當然鍵和值得名字可以根據自己的情況自己取。

當裏面的參數是兩個的時候,$value只用來存放從數組中取出來的值,而沒有鍵。

<?php

    $arr = array(1,9,4,2,8,10,5);

    foreach ($arr as $key => $value) {
        echo $key . '=>' . $value . '  ';
    }

    echo '<br>';

    foreach ($arr as $value) {
        echo $value . '  ';
    }
.....結果......
0=>1 1=>9 2=>4 3=>2 4=>8 5=>10 6=>5 
1 9 4 2 8 10 5

在第二個循環中沒有鍵的輸出。

上面的兩種循環結構,就是我們常用到的數組遍歷的方法,其中第二個方法,也就是用foreach的方法,我們會經常用到,因爲這種方法對於所有的數組都適用,而不用考慮下標的問題。

數組的相關函數

  • count($array) 統計一個數組裏的所有元素,或者一個對象裏的東西。從而的到數組的大小,也就是長度。然後通過for循環,把i( i從0開始)。
  • is_array($arr) 判斷變量是否是一個數組。傳一個變量進去,如果這個變量是一個數組,則返回true,否則則返回false;
  • array_search (value) 在數組中搜索給定的值,如果成功則返回相應的鍵名 。當我們想知道一個數組中有沒有一個數,可以使用這個函數,如果數組中有你想找的值,則返回這個值對應的鍵值。
  • array_reverse($arr),傳進去一個數組,返回一個與這個數組相反的數組。

    <?php
    
    $arr = array(1,9,4,2,8,10,5);
    
    $array = array_reverse($arr);
    
    print_r($array);
    .....結果......
    Array ( [0] => 5 [1] => 10 [2] => 8 [3] => 2 [4] => 4 [5] => 9 [6] => 1 )
    
  • array_merge($arr1,$arr2),傳進去兩個數組,一個數組中的值附加在前一個數組的後面。返回作爲結果的數組。 如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。

  • unset($value) 傳進去的變量可以銷燬一個數組,也可以銷燬數組中的一個值,當通過數組[下標]的方式傳入是,會銷燬數組中的這個值,但是當傳進去的數組時,會把整個數組進行銷燬。

  • sort() 本函數對數組進行排序。當本函數結束時數組單元將被從最低到最高重新安排。當數組中值都是數字的時候,可以使用這個函數進行排序,不過排序的結果是數字按照從小到大的順序。

    <?php
    
        $arr = array(1,9,4,2,8,10,5);
    
        sort($arr);
    
        print_r($arr);
    .....結果.....
    Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 8 [5] => 9 [6] => 10 )
    
  • usort($array,func_name) 傳進去一個數組,和一個自己寫的方法名。使用用戶自定義的比較函數對數組中的值進行排序,在上面的一個方法,你只能得到從小到大的順序,但是我們的要求是從大到小,這就會用到這個函數,第二個參數是我們寫的排序規則的函數。

    <?php
    
    $arr = array(1,9,4,2,8,10,5);
    
    function mysort($a,$b){ //寫自己的函數,使數組按照從大到小的順序進行排序。
    if($a == $b){
        return 0;
    }
    
        return $a < $b ? 1 : -1;
    }
    
    usort($arr, 'mysort');
    
    print_r($arr);
    ......結果......
    Array ( [0] => 10 [1] => 9 [2] => 8 [3] => 5 [4] => 4 [5] => 2 [6] => 1 )
    

    這裏使用到可變函數。

數組的運算符

我們在運算符那一節並沒有講到數組的運算符,其實數組也是有運算符的。

  • $a + $b 聯合 $a 和 $b 的聯合。運算符把右邊的數組元素附加到左邊的數組後面,兩個數組中都有的鍵名,則只用左邊數組中的,右邊的被忽略。
  • $a == $b 相等 如果 $a 和 $b 具有相同的鍵/值對則爲 TRUE 。
  • $a === $b 全等 如果 $a 和 $b 具有相同的鍵/值對並且順序和類型都相同則爲 TRUE 。
  • $a != $b 不等 如果 $a 不等於 $b 則爲 TRUE 。
  • $a <> $b 不等 如果 $a 不等於 $b 則爲 TRUE 。
  • $a !== $b 不全等 如果 $a 不全等於 $b 則爲 TRUE 。
    在這裏看來數組的運算符也是很好理解的。

總結

數組講到這裏,算是基本講完了,數組在我們的開發中是經常用到的,不止上面的以爲數組,有時候數組裏面還可能是一個數組,只要數組的結構在腦海中有清晰的認識,不管有幾個數組,都是可以解決的,同時數組的出現也引出了一些關於數組的算法。可以看
數組的順序查找和二分查找

數組的插入排序和快速排序

發佈了38 篇原創文章 · 獲贊 28 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章