首頁  >  文章  >  後端開發  >  PHP教學之數組的簡單介紹

PHP教學之數組的簡單介紹

巴扎黑
巴扎黑原創
2017-08-09 14:41:221183瀏覽

一、概要

  • 簡單介紹及基本使用

  • php陣列常用標準函式庫函數使用

  • php陣列模擬常見資料結構

  • php陣列使用須知與注意點

  • FAQ  


#二、簡單介紹及基本使用

  • PHP 中的陣列其實是一個有序映射。映射是一種把 values 關聯到 keys 的型別。

  • 透過6b15ce87cb24ada0dae4cfa4a212a97c= 5.4 , 我們可以使用更簡潔的方式定義陣列

<?php $arr = [1, 2, 3, 4]; 
$arr = [&#39;a&#39; => 1, &#39;z&#39; => 100]; 123
  • php 陣列很強大,可以定義混合型別陣列

<?php $arr = [1, &#39;hello&#39; => &#39;11&#39;, &#39;arr&#39; => [1, &#39;a&#39;=>&#39;b&#39;]];12
  • 關於陣列的訪問操作,可以透過[index] 存取:

<?php $arr = [1, &#39;hello&#39; => &#39;11&#39;, &#39;arr&#39; => [1, &#39;a&#39;=>&#39;b&#39;]];
var_dump($arr[0]); // 1var_dump($arr[&#39;arr&#39;]); // [1, &#39;a&#39; => &#39;b&#39;]1234
  • 也可以透過[] 修改陣列元素的值

<?php $arr = [1, &#39;hello&#39; => &#39;11&#39;, &#39;arr&#39; => [1, &#39;a&#39;=>&#39;b&#39;]];$arr[0] = &#39;test&#39;;
var_dump($arr);  1234
  • 你也可以在初始化陣列繼續加入陣列元素

<?php$arr = [1, 2, 3, 4]; 
//追加元素$arr[] = &#39;a&#39;;// 添加 key, value$arr[&#39;test&#39;] = &#39;b&#39;;123456
  • 當然,刪除數組元素的操作必須支援

<?php$arr = [1, &#39;hello&#39; => &#39;11&#39;, &#39;arr&#39; => [1, &#39;a&#39;=>&#39;b&#39;]];unset($arr[&#39;hello&#39;]);
var_dump($arr[&#39;hello&#39;]);  // null1234
  • 開發中經常需要遍歷數組, 可使用foreach :

<?php $arr = [1, &#39;hello&#39; => &#39;11&#39;, &#39;arr&#39; => [1, &#39;a&#39;=>&#39;b&#39;]];foreach($arr as $key => $value) {
    var_dump($key . &#39; => &#39; . $value);
}12345

更多數組遍歷的方法請參考php-數組遍歷
- 數組之間的比較,數組無法比較大小, 但可以根據一定條件判斷是否相等

<?php 
// $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。
// $a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。$a = [1, 2];$b = [&#39;1&#39; => 2, 0 => 1];

var_dump($a == $b); // truevar_dump($a === $b); // false123456789

三、實用的數組工具函數

掌握了數組的基本操作(定義使用,增刪改查, 遍歷) 之後,你就可以在開發中使用數組, 但只有這些操作是遠遠不夠的,為了滿足複雜多變的開發場景對數組操作的需求,php 提供了功能強大的一套Array 操作的函數
- 獲取數組長度

<?php $arr = [1, 2, 3];
var_dump(count($arr)); // 3123
  • 希望判斷一個變數是否是數組,可以透過is_array():

<?php 
$arr = [1, 2, 3];$notArr = &#39;111&#39;;
var_dump(is_array($arr)); // truevar_dump(is_array($notArr)); // false12345
  • 更具key 或 value,判斷元素是否在陣列中

// 判断key 是否在数组中$arr = [&#39;a&#39; => 2, 4];
var_dump(isset($arr[&#39;a&#39;])); // true  var_dump(array_key_exists(&#39;a&#39;, $arr)); // true// 判断 value 是否在数组中in_array(5, $arr);  // false1234567
  • 取得數組所有鍵(keys)

<?php $arr = [&#39;a&#39; => 2, 4];$keys = array_keys($arr); // [&#39;a&#39;, 1]123
  • #取得陣列的所有值(values)

<?php $arr = [&#39;a&#39; => 2, 4];$values = array_values($arr); // [2, 4]123
  • 統計數組各個元素值出現的次數可以使用array_count_values:

<?php$arr = [1, 3, 2, &#39;a&#39; => 1, &#39;b&#39; => 2];
var_dump(array_count_values($arr));/*
array(3) {
  [1]=>
  int(2)
  [3]=>
  int(1)
  [2]=>
  int(2)
}
*/1234567891011121314

數組與數組之間的操作:數組可以看做一個集合, 集合間的操作(交集,差集,並集, 補集, 比較等) php 也提供對應的方法實作

  • ##陣列的合併

  • <?php$arr1 = [&#39;a&#39; => 1, 2, &#39;b&#39; => 3];$arr2 = [&#39;b&#39; => 5, 2];
    var_dump( array_merge($arr1, $arr2) ); 
    /*
    array(4) {
      ["a"]=>
      int(1)
      [0]=>
      int(2)
      ["b"]=>
      int(5)
      [1]=>
      int(2)
    }
    
    // 你也可以使用 + 操作符, 请注意两种方法结果的差别
    var_dump($arr1 + $arr2); 
    */12345678910111213141516171819
  • 如果是需要計算兩個或跟多數組value的交集, 可使用

    array_intersect

  • <?php$arr1 = [1, 2, 3];$arr2 = [5, 2];
    var_dump( array_intersect($arr1, $arr2) );  // [2]1234
  • #數組的差集(按值value 和按key)

  • <?php$a = [1, 2];$b = [&#39;1&#39; => 2, 0 => 1, 4];//array_diff 按照索引 和 值 比较差异var_dump(array_diff($a, $b));// array_diff_key() 函数用于比较两个(或更多个)数组的键名 ,并返回差集 var_dump(array_diff_key($a, $b)); 123456789
  • 如果需要取得子數組,可以透過array_slice 產生類似python 切片的效果

  • <?php$arr = [1, 2, 3, 4, 5, 6, 7, 8];// 从第3个元素开始, 直到结束var_dump(array_slice($arr, 2));// 从第3个元素开始, 长度为4var_dump(array_slice($arr, 2, 4));// 从第3个元素开始,到倒数第3个元素var_dump(array_slice($arr, 2, -2));// 注意 索引的差别var_dump(array_slice($arr, 2, -2, true));12345678910111213
  • 關於陣列的排序操作,也是比較常見的開發需求,需要注意的是:

    php排序函數都是直接作用於陣列本身, 而不是返回一個新的有序的數組。 , 以下程式碼提供幾個常見的場景, 更多請參考php對陣列進行排序:

  • <?php// 按照值(value)升序排序, 索引更新$arr = [6,&#39;a&#39;=>2, 3, 4, 6, -1, 7, 8];
    sort($arr);
    var_dump($arr);// 按照值(value)升序排序, 索引保持$arr = [6,&#39;a&#39;=>2, 3, 4, 6, -1, 7, 8];
    asort($arr);
    var_dump($arr);// 按照值(value)降序排序, 索引保持$arr = [6,&#39;a&#39;=>2, 3, 4, 6, -1, 7, 8];
    arsort($arr);
    var_dump($arr);// 按照 键(key)进行升序排序 , 索引保持$arr = [&#39;a&#39; => 10, &#39;c&#39; => 1, &#39;b&#39; => 12];
    ksort($arr);
    var_dump($arr);// 按照 键(key)进行降序排序 , 索引保持$arr = [&#39;a&#39; => 10, &#39;c&#39; => 1, &#39;b&#39; => 12];
    krsort($arr);
    var_dump($arr);// 用户自定义排序, 根据值(value) , 索引更新// 请注意:对于自定义的比较函数,// 在第一个参数小于,等于或大于第二个参数时,// 该比较函数必须相应地返回一个小于,等于或大于 0 的整数。function cmp($val1, $val2){    if($val1 > $val2) {        return 1;
        } elseif ($val1 == $val2) {        return 0;
        } else {        return -1;
        }
    }$arr = [    &#39;a&#39; => 1,    &#39;A&#39; => 3,    &#39;B&#39; => 2,
    ];
    
    usort($arr, cmp);
    var_dump($arr);// 根据key 自定义排序规则,请使用 uksort(), 用法同usort()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  • 關於陣列與字串之間的操作一般有切割字串,合併數組元素轉為字串兩種操作,可以藉助explode與implode實現

  • #
    <?phpvar_dump(explode(&#39;,&#39;, "a,a,a,a,a,a")); // 以,为分割符将字符串"a,a,a,a,a,a" 切割成数组var_dump(implode(&#39;-&#39;, [1, 2, 3, 4, 5])); //以 - 为 拼接符 将 数组[1, 2, 3, 4, 5] 拼接成字符串1234

關於php 更多數組相關的函數, 可以參考官方文件php數組函數列表


四、數組模擬常見資料結構

php 數組可以模擬常見的資料結構,最顯而易見的便是映射表和字典, 這裡簡單介紹php數組對棧和佇列的模擬。

  • 類比堆疊(FILO)

  • <?php$stack = [1, 2, 3, 4];//入栈array_push($stack, -1);
    var_dump($stack); // [1, 2, 3, 4, -1]//出栈$e = array_pop($stack);
    var_dump($e); // -1var_dump($stack);  // [1, 2, 3, 4]1234567891011
    ##模擬佇列(FIFO)
  • <?php$queue = [];//入队列array_unshift($queue, 1);
    array_unshift($queue, 2);
    array_unshift($queue, 3);
    array_unshift($queue, 4);//出队列$e = array_pop($queue);
    var_dump($e); // 1$e = array_pop($queue);
    var_dump($e); // 2$e = array_pop($queue);
    var_dump($e); // 3$e = array_pop($queue);
    var_dump($e); // 4123456789101112131415161718
五、php陣列使用須知與注意點

    #php 陣列key值會存在以下強制轉換

    • #################### #####包含有合法整數值的字串會被轉換為整數。例如鍵名 “8” 實際上會儲存為 8。但是 “08” 則不會強制轉換,因為其不是一個合法的十進制數值。 ############浮點數也會轉換為整數,表示其小數部分會被捨去。例如鍵名 8.7 實際上會被儲存為 8。 ############布林值也會轉換成整數型。即鍵名 true 實際上會儲存為 1 而鍵名 false 會被儲存為 0。 ###
    • Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。

    • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

因此以下代码可能导致意外的结果,请注意以下代码的输出

<?php$arr = [1, 2, &#39;8&#39; => 3];$arr[false] = -20;
var_dump($arr); // [-20, 2, &#39;8&#39; => 3]$arr[8] = 20;
var_dump($arr); // [-20, 2, 8 => 20]$arr[8.7] = 15;
var_dump($arr); // [-20, 2, 8 => 15]$arr["8.7"] = 10;
var_dump($arr); // [-20, 2, 8 => 10]$arr[$val]  = 5; // 注意$val之前为声明,因此默认值为null, 数组key为null时会被转为""空串
var_dump($arr); // [-20, 2, 8 => 10, "" => 5]$arr[bar] = 6; // 标识符被转化为 &#39;bar&#39;var_dump($arr); // [-20, 2, 8 => 10, "" => 5, &#39;bar&#39; => 6]12345678910111213141516171819202122
  • 关于php数组的类型转换
    php数组可以将其他一切类型转为数组,转化的效果请参考一下代码,重点观察对 null  和 object对象的转化:

<?php$var = true;
var_dump((array)$var);/* array(1) {
  [0]=>
  bool(true)
}*/$var = 1;
var_dump((array)$var);/* array(1) {
  [0]=>
  int(1)
}*/$var = 1.1;
var_dump((array)$var);/* array(1) {
  [0]=>
  float(1.1)
}*/$var = "111";
var_dump((array)$var);/* array(1) {
  [0]=>
  string(3) "111"
}*/$var = null;
var_dump((array)$var);  // 返回空数组/* array(0) {
} */class Cls { public $a = 1; protected $b = 2; private $c = 3; }
var_dump((array)(new Cls)); // 可见性不同 key值格式有所不同/* array(3) {
  ["a"]=>
  int(1)
  ["*b"]=>
  int(2)
  ["Clsc"]=>
  int(3)
} */123456789101112131415161718192021222324252627282930313233343536373839404142434445

关于PHP类型转换的了解,请参考PHP-类型转换的判别


六、FAQ

  • 如何添加数组元素更为高效? array_push($arr, key, value) or $arr[key] = value  ?  答: 后者更为高效, 更多细节请参考官方资料

  • isset or array_key_exists() ?  答:

    • 对于存在key的数组,如果 对应的value = null , isset($arr[key]) 会返回 false;而对于array_key_exists 只要对应key存在就会返回true;

    • 然而在效率方面,isset 效率 高于array_key_eixsts
      在判断数组元素是否存在的最佳实践如下:

<?php 
if (isset($arr[$key]) or array_key_exists($key, $arr)) { ...}1234
  • 数组合并 +array_merge 的区别? 答:可以参考该资料

  • array_diff== 的异同? 答:语义有所差别, 数组的相等比较 推荐只使用==

  • 遍历方式那种更高效? 答:foreach 方式 遍历 最为高效

以上是PHP教學之數組的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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