PHP強(qiáng)化之03 - 數(shù)組 Array(新)

----- 最后更新【2022-01-09】-----

PHP強(qiáng)化系列--目錄

本文目錄結(jié)構(gòu)預(yù)覽:

  • 一或渤、簡(jiǎn)介
  • 二、語(yǔ)法
    1、定義數(shù)組
    2、數(shù)組運(yùn)算符
  • 三、類(lèi)型轉(zhuǎn)換
  • 四、數(shù)組解包
  • 五、內(nèi)部指針
  • 六洞焙、數(shù)組遍歷
    1、for循環(huán)
    2拯啦、foreach循環(huán)
    3澡匪、while, list(), each()組合循環(huán)
    4、三種遍歷方式的區(qū)別
    5褒链、for, next(), key(), current()組合
  • 七唁情、常用函數(shù)
    1、對(duì)數(shù)組進(jìn)行排序
    2甫匹、數(shù)組與字符串間的轉(zhuǎn)換
    3甸鸟、數(shù)組的運(yùn)算
    4、數(shù)組的鍵與值
    5兵迅、數(shù)組生成器
    6抢韭、回調(diào)函數(shù)的應(yīng)用
  • 八、經(jīng)典實(shí)例
  • 九恍箭、參考

一刻恭、簡(jiǎn)介

PHP 中的數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類(lèi)型扯夭。此類(lèi)型在很多方面做了優(yōu)化鳍贾,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量)勉抓、散列表(是映射的一種實(shí)現(xiàn))贾漏、字典候学、集合藕筋、棧、隊(duì)列以及更多可能性梳码。由于數(shù)組元素的值也可以是另一個(gè)數(shù)組隐圾,樹(shù)形結(jié)構(gòu)和多維數(shù)組也是允許的。

可以用 array()語(yǔ)言結(jié)構(gòu)來(lái)新建一個(gè)數(shù)組掰茶。自 5.4 起可以使用短數(shù)組定義語(yǔ)法暇藏,用 [] 替代 array()。

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

// 自 PHP 5.4 起
$array = [
    0 => "bar",
    1 => "foo"
];

本文內(nèi)容可能會(huì)比較多濒蒋,為了方面提前知道有哪些內(nèi)容盐碱,這里先作一個(gè)簡(jiǎn)要的展示:
簡(jiǎn)介->語(yǔ)法->類(lèi)型轉(zhuǎn)換->數(shù)組解包->內(nèi)部指針->數(shù)組遍歷->常用函數(shù)->經(jīng)典實(shí)例->參考

二把兔、語(yǔ)法

1、定義數(shù)組

組成數(shù)組的 key 可以是 integer 或者 string瓮顽,而 value 可以是任意類(lèi)型县好。

此外 key 會(huì)有如下的強(qiáng)制轉(zhuǎn)換:
1)String 中包含有效的十進(jìn)制 int,除非數(shù)字前面有一個(gè) + 號(hào)暖混,否則將被轉(zhuǎn)換為 int 類(lèi)型缕贡。例如鍵名 "8" 實(shí)際會(huì)被儲(chǔ)存為 8。另外拣播, "08" 不會(huì)被強(qiáng)制轉(zhuǎn)換晾咪,因?yàn)樗皇且粋€(gè)有效的十進(jìn)制整數(shù)。
2)Float 也會(huì)被轉(zhuǎn)換為 int 贮配,意味著其小數(shù)部分會(huì)被舍去谍倦。例如鍵名 8.7 實(shí)際會(huì)被儲(chǔ)存為 8。
3)Bool 也會(huì)被轉(zhuǎn)換成 int泪勒。即鍵名 true 實(shí)際會(huì)被儲(chǔ)存為 1 而鍵名 false 會(huì)被儲(chǔ)存為 0剂跟。
4)Null 會(huì)被轉(zhuǎn)換為空字符串,即鍵名 null 實(shí)際會(huì)被儲(chǔ)存為 ""酣藻。
5)Array 和 object 不能 被用為鍵名曹洽。堅(jiān)持這么做會(huì)導(dǎo)致警告:Illegal offset type。

如果在數(shù)組定義時(shí)多個(gè)元素都使用相同鍵名辽剧,那么只有最后一個(gè)會(huì)被使用送淆,其它的元素都會(huì)被覆蓋。

php > $array = array(
       1    => "a",
       "1"  => "b",
       1.5  => "c",
       true => "d",
  );
php > var_dump($array);
array(1) {
  [1]=>
  string(1) "d"
}

注意:
在 PHP 8.0.0 之前怕轿,方括號(hào)和花括號(hào)可以互換使用來(lái)訪(fǎng)問(wèn)數(shù)組單元(例如 $array[42] 和 $array{42} 在上例中效果相同)偷崩。 花括號(hào)語(yǔ)法在 PHP 7.4.0 中已棄用,在 PHP 8.0.0 中不再支持撞羽。

# php < 8.0
php > $arr = [ 'a'=>123 ];
php > echo $arr['a'];
123
php >  echo $arr{'a'};
123

# php >= 8.0
php > $arr = [ 'a'=>123 ];
php > echo $arr['a'];
123
php > echo $arr{'a'};   # 致命錯(cuò)誤
Fatal error: Array and string offset access syntax with curly braces is no longer supported in php shell code on line 1

注意:該始終在用字符串表示的數(shù)組索引上加上引號(hào)阐斜。例如用 $foo['bar'] 而不是 $foo[bar]。(但用不著給鍵名為 常量 或 變量 的加上引號(hào)诀紊,否則會(huì)使 PHP 不能解析它們谒出。)

# php < 8.0
php >  $arr[a]=1111111111111111;    # Warning級(jí)錯(cuò)誤
PHP Warning:  Use of undefined constant a - assumed 'a' (this will throw an Error in a future version of PHP) in php shell code on line 1

# php >= 8.0
php > $arr[a]=11111111111;   #致命錯(cuò)誤
Warning: Uncaught Error: Undefined constant "a" in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1

注意:但是在字符串中引用數(shù)組時(shí)則不需要加給索引加引號(hào)

php > $arr['a'] = 123;
php > echo "My array: $arr[a].";   # 正確,但不建議這種寫(xiě)法邻奠,容易與常量混淆
My array: 123.
php > echo "My array: $arr['a'].";   # 語(yǔ)法錯(cuò)誤
Parse error: syntax error, unexpected string content "", expecting "-" or identifier or variable or number in php shell code on line 1
php > echo "My array: {$arr['a']}.";  # 正確笤喳,官方建議
My array: 123.

2、數(shù)組運(yùn)算符

例子 名稱(chēng) 結(jié)果
$a + $b 聯(lián)合 $a 和 $b 的聯(lián)合碌宴。
$a == $b 相等 如果 $a 和 $b 具有相同的鍵/值對(duì)則為 TRUE杀狡。
$a === $b 全等 如果 $a 和 $b 具有相同的鍵/值對(duì)并且順序和類(lèi)型都相同則為 TRUE。
$a != $b 不等 如果 $a 不等于 $b 則為 TRUE贰镣。
$a <> $b 不等 如果 $a 不等于 $b 則為 TRUE呜象。
$a !== $b 不全等 如果 $a 不全等于 $b 則為 TRUE膳凝。

+運(yùn)算符把右邊的數(shù)組元素附加到左邊的數(shù)組后面,兩個(gè)數(shù)組中都有的鍵名恭陡,則只用左邊數(shù)組中的鸠项,右邊的被忽略。

php > $a = array("a" => "apple", "b" => "banana");
php > $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
php > $c = $a + $b;
php > var_dump($c);
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}

數(shù)組中的單元如果具有相同的鍵名和值則比較時(shí)相等子姜。

php > $a = array("apple", "banana");
php > $b = array(1 => "banana", "0" => "apple");
php > var_dump($a == $b); 
bool(true)
php > var_dump($a === $b);
bool(false)

三祟绊、類(lèi)型轉(zhuǎn)換

對(duì)于任意 integerfloat哥捕,string牧抽,booleanresource 類(lèi)型,如果將一個(gè)值轉(zhuǎn)換為數(shù)組遥赚,將得到一個(gè)僅有一個(gè)元素的數(shù)組扬舒,其下標(biāo)為 0,該元素即為此標(biāo)量的值凫佛。換句話(huà)說(shuō)讲坎,(array) $scalarValuearray($scalarValue) 完全一樣。

如果一個(gè) object 類(lèi)型轉(zhuǎn)換為 array愧薛,則結(jié)果為一個(gè)數(shù)組晨炕,其單元為該對(duì)象的屬性。鍵名將為成員變量名毫炉,不過(guò)有幾點(diǎn)例外: 私有變量前會(huì)加上類(lèi)名作前綴瓮栗;保護(hù)變量前會(huì)加上一個(gè) '*' 做前綴。這些前綴的前后都各有一個(gè) NUL 字節(jié)瞄勾。 未初始化的類(lèi)型屬性將會(huì)被丟棄费奸。如下:

php > class A {
         private $B = 111;
         protected $C = 222;
         public $D = 333;
    
         function __construct()
         {
             $E = 444;
             $this->{1} = 555;
         }
     }
php > var_export((array) new A());
array (
  '' . "\0" . 'A' . "\0" . 'B' => 111,
  '' . "\0" . '*' . "\0" . 'C' => 222,
  'D' => 333,
  1 => 555,
)
php > var_dump((array) new A());
array(4) {
  [" A B"]=>
  int(111)
  [" * C"]=>
  int(222)
  ["D"]=>
  int(333)
  [1]=>
  int(555)
}

將 NULL 轉(zhuǎn)換為 array 會(huì)得到一個(gè)空的數(shù)組。

四进陡、數(shù)組解包

在 array 定義時(shí)愿阐,用 ... 前綴的一個(gè) array 可以被展開(kāi)到當(dāng)前位置。 只有實(shí)現(xiàn)了 Traversable(可以使用 foreach 進(jìn)行遍歷)的數(shù)組和對(duì)象才能被展開(kāi)趾疚。 PHP 7.4.0 開(kāi)始可以使用 ... 解包 array缨历。

它可以多次使用,在 ... 操作符前后都可以添加常規(guī)元素:

php > $arr1 = [111, 222, 333];
php > $arr2 = ['apple','pear'];
php > $arr3 = [0,...$arr1,...$arr2,444];
php > var_dump($arr3);
array(7) {
  [0]=>
  int(0)
  [1]=>
  int(111)
  [2]=>
  int(222)
  [3]=>
  int(333)
  [4]=>
  string(5) "apple"
  [5]=>
  string(4) "pear"
  [6]=>
  int(444)
}

... 操作符解包 array 時(shí)也遵守函數(shù) array_merge() 的語(yǔ)義盗蟆。 也就是說(shuō)戈二,key 為字符時(shí),后面的字符鍵會(huì)覆蓋之前的字符鍵喳资;key 為 integer 時(shí)則會(huì)重新編號(hào):

注意:
在 PHP 8.1 之前,帶有 string 鍵的 array 無(wú)法解包腾供。如:
$arr1 = ['a'=>'apple', 'b'=>'pear']; $arr2 = ['cc', ...$arr1];
這樣會(huì)報(bào)錯(cuò)仆邓,因?yàn)閿?shù)組$arr1的存在字符串鍵鲜滩。

最新版本的 PHP 8.1+ ,已經(jīng)加入了對(duì)字符串鍵控?cái)?shù)組的數(shù)組解包支持:

php > $arrayA = ['a' => 1];
php > $arrayB = ['b' => 2];
php > $result = ['a' => 0, ...$arrayA, ...$arrayB];
php > var_dump($result);
array(2) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
}

五节值、內(nèi)部指針

方法 說(shuō)明
reset 將數(shù)組的內(nèi)部指針指向第一個(gè)單元徙硅,并返回第一個(gè)數(shù)組單元的值
current 返回?cái)?shù)組中的當(dāng)前單元的值
next 將數(shù)組中的內(nèi)部指針向前移動(dòng)一位,并返回下一個(gè)單元的值
prev 將數(shù)組的內(nèi)部指針倒回一位搞疗,并返回前一個(gè)單元的值
each 返回?cái)?shù)組中當(dāng)前的 鍵/值 對(duì)嗓蘑,并將數(shù)組指針向前移動(dòng)一步(本函數(shù)已廢用)
end 將數(shù)組的內(nèi)部指針指向最后一個(gè)單元,并返回最后一個(gè)數(shù)組單元的值
key 返回?cái)?shù)組中當(dāng)前單元的鍵名

例1匿乃、

php > $array = array('step one', 'step two', 'step three', 'step four');
php > echo current($array);
step one
php > next($array);
php > next($array);
php > echo current($array);
step three
php > reset($array);
php > echo current($array);
step one

例2:

php > $foo = array("Robert" => "Bob", "Seppo" => "Sepi");
php > print_r(each($foo));
Array
(
    [1] => Bob
    [value] => Bob
    [0] => Robert
    [key] => Robert
)
php > print_r(each($foo));
Array
(
    [1] => Sepi
    [value] => Sepi
    [0] => Seppo
    [key] => Seppo
)

六桩皿、數(shù)組遍歷

1、for循環(huán)

適用情況幢炸,數(shù)組的下標(biāo)為從0開(kāi)始的連續(xù)索引泄隔。

php > $arr = ['a','b','c','d','e','f','g'];
php > $count = count($arr);
php > for($i = 0; $i < $count; $i++){
          echo $arr[$i] . "==";
      }
a==b==c==d==e==f==g==

2、foreach循環(huán)

foreach為php遍歷數(shù)組最常用的方法宛徊。

php > $arr = array( 12, 'a'=>8, 6=>10, 'b'=> 3, 80);
php > foreach($arr as $k=>$v){
          echo " $k: $v  ";
      }
【0: 12 】【a: 8 】【6: 10 】【b: 3 】【7: 80 】

可以通過(guò)引用傳遞 array 的值來(lái)直接更改數(shù)組的值佛嬉。

php > $colors = array('red', 'blue', 'green', 'yellow');
          foreach ($colors as &$color) {
          $color = strtoupper($color);
      }

php > unset($color);   /* 確保后面對(duì) $color 的寫(xiě)入不會(huì)修改最后一個(gè)數(shù)組元素 */
php > print_r($colors);
Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

3、while, list(), each()組合循環(huán)

php > $arr = array( 12, 'a'=>8, 6=>10, 'b'=> 3, 80);
php > while(list($key,$val) = each($arr)){
          echo "【 $key: $val 】";
      }
【 0: 12 】【 a: 8 】【 6: 10 】【 b: 3 】【 7: 80 】

注意:由于 list 方法的不確定性闸天,不建議使用該方法遍歷數(shù)組暖呕,了解一下即可。

4苞氮、三種遍歷方式的區(qū)別

  • for循環(huán)只能遍歷索引數(shù)組
  • foreach可以遍歷索引和關(guān)聯(lián)數(shù)組
  • while缰揪、list()、each()組合循環(huán)同樣可以遍歷索引和關(guān)聯(lián)數(shù)組
  • while葱淳、list()钝腺、each()組合不會(huì)reset()
  • foreach遍歷會(huì)對(duì)數(shù)組進(jìn)行reset()操作

5、for, next(), key(), current()組合

也是了解即可赞厕。

php > $arr = array( 12, 'a'=>8, 6=>10, 'b'=> 3, 80);
php > $count = count($arr);
php > for($i=0; $i<$count;$i++){
          $key = key($arr);
          $val = current($arr);
          echo "$key: $val ==\n";
          next($arr);
      }
0: 12 ==
a: 8 ==
6: 10 ==
b: 3 ==
7: 80 ==

//注意艳狐,當(dāng)循環(huán)結(jié)束后如果再去獲取key和val,將不會(huì)成功皿桑,如:
$key = key($arr);
$val = current($arr);
var_dump($key,$val);   //結(jié)果為:NILL毫目、bool(false)

七、常用函數(shù)

1诲侮、對(duì)數(shù)組進(jìn)行排序

函數(shù)名稱(chēng) 排序依據(jù) 索引鍵保持 排序的順序 說(shuō)明
array_multisort 鍵值關(guān)聯(lián)(string)的保持镀虐,數(shù)字類(lèi)型的不保持 第一個(gè)數(shù)組或者由選項(xiàng)指定 對(duì)多個(gè)數(shù)組或多維數(shù)組進(jìn)行排序
sort 由低到高 對(duì)數(shù)組從最低到最高重新排序
rsort 由高到低
asort 由低到高
arsort 由高到低 對(duì)數(shù)組進(jìn)行逆向排序并保持索引關(guān)系
natsort 自然排序
natcasesort 自然排序,大小寫(xiě)不敏感
ksort 由低到高
krsort 由高到低
usort 由用戶(hù)定義
uasort 由用戶(hù)定義
uksort 由用戶(hù)定義
shuffle 打亂數(shù)組 此函數(shù)會(huì)為數(shù)組中的元素賦與新的鍵名沟绪,這將刪除原有的鍵名

注意:
以上的所有排序函數(shù)都是直接作用于數(shù)組本身刮便, 而不是返回一個(gè)新的有序的數(shù)組短蜕。

使用 array_multisort 對(duì)多維數(shù)組或多個(gè)數(shù)組排序碍侦,原理類(lèi)似于SQL語(yǔ)句中Order By 的多字段排序盆佣。但是提供給array_multisort 的多個(gè)數(shù)組數(shù)組和之前的數(shù)組要有相同數(shù)量的元素仑氛。

例:

// 多個(gè)數(shù)組排序
php > $ar1 = array(10, 100, 100, 0,100);
php > $ar2 = array(1, 5, 2, 4, 3);  # 和第一個(gè)數(shù)組一樣擁有5個(gè)元素
php > array_multisort($ar1, $ar2);
php >
php > print_r($ar1);
Array
(
    [0] => 0
    [1] => 10
    [2] => 100
    [3] => 100
    [4] => 100
)
php > print_r($ar2);
Array
(
    [0] => 4
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 5
)

2、數(shù)組與字符串間的轉(zhuǎn)換

函數(shù) 說(shuō)明
implode 將一個(gè)一維數(shù)組的值轉(zhuǎn)化為字符串搜贤。別名:join
explode 使用一個(gè)字符串分割另一個(gè)字符串谆沃,返回?cái)?shù)組
split 用正則表達(dá)式將字符串分割到數(shù)組中
preg_split 通過(guò)一個(gè)正則表達(dá)式分隔字符串,返回?cái)?shù)組仪芒。通常是比 split() 更快的替代方案
str_split 根據(jù)每一段的長(zhǎng)度唁影,將字符串轉(zhuǎn)換為數(shù)組
php > $str ="hypertext language, programming";
php > $keywords = preg_split("/[\s,]+/", $str);
php > print_r($keywords);
Array
(
    [0] => hypertext
    [1] => language
    [2] => programming
)

3、數(shù)組的運(yùn)算

函數(shù) 說(shuō)明
array_unique 移除數(shù)組中重復(fù)的值掂名。返回過(guò)濾后的數(shù)組
array_merge 合并一個(gè)或多個(gè)數(shù)組据沈。返回合并后的結(jié)果數(shù)組。
array_merge_recursive 遞歸地合并一個(gè)或多個(gè)數(shù)組
array_intersect 計(jì)算數(shù)組的交集
array_intersect_assoc 帶索引檢查計(jì)算數(shù)組的交集
array_diff 計(jì)算數(shù)組的差集
array_diff_assoc 帶索引檢查計(jì)算數(shù)組的差集
array_push 將一個(gè)或多個(gè)單元壓入數(shù)組的末尾(入棧)铆隘。返回處理之后數(shù)組的元素個(gè)數(shù)卓舵。
array_pop 彈出數(shù)組最后一個(gè)單元(出棧)。返回 array 的最后一個(gè)值
array_pad 以指定長(zhǎng)度將一個(gè)值填充進(jìn)數(shù)組
array_shift 將 array 的第一個(gè)單元移出并作為結(jié)果返回
array_unshift 將傳入的單元插入到 array 數(shù)組的開(kāi)頭
array_replace 使用傳遞的數(shù)組替換第一個(gè)數(shù)組的元素
array_replace_recursive 使用傳遞的數(shù)組遞歸替換第一個(gè)數(shù)組的元素
list 把數(shù)組中的值賦給一組變量
像 array() 一樣膀钠,list()不是真正的函數(shù)掏湾,而是語(yǔ)言結(jié)構(gòu)。

1)— 合并一個(gè)或多個(gè)數(shù)組——array_merge肿嘲。該函數(shù)與數(shù)組解包運(yùn)算符(...)原理一樣融击。
array_merge() 將一個(gè)或多個(gè)數(shù)組的單元合并起來(lái),一個(gè)數(shù)組中的值附加在前一個(gè)數(shù)組的后面雳窟。返回作為結(jié)果的數(shù)組尊浪。
如果輸入的數(shù)組中有相同的字符串鍵名,則該鍵名后面的值將覆蓋前一個(gè)值封救。然而拇涤,如果數(shù)組包含數(shù)字鍵名,后面的值將不會(huì)覆蓋原來(lái)的值誉结,而是附加到后面鹅士。
如果只給了一個(gè)數(shù)組并且該數(shù)組是數(shù)字索引的,則鍵名會(huì)以連續(xù)方式重新索引惩坑。

$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);

//以上例程會(huì)輸出:
Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)

注意:
PHP 7.4.0+ 允許不帶參數(shù)調(diào)用掉盅,之前版本至少需要一個(gè)參數(shù)。
如果你想完全保留原有數(shù)組并只想新的數(shù)組附加到后面以舒,則可用 + 運(yùn)算符趾痘。

2)計(jì)算數(shù)組的交集 — array_intersect
array array_intersect ( array $array1 , array $array2 [, array $... ] )
返回一個(gè)數(shù)組,該數(shù)組包含了所有在 array1 中也同時(shí)出現(xiàn)在所有其它參數(shù)數(shù)組中的值蔓钟。

$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);
// 以上例程會(huì)輸出:
Array
(
    [a] => green
    [0] => red
)

3)計(jì)算數(shù)組的差集 — array_diff
array array_diff ( array $array1 , array $array2 [, array $... ] )
返回一個(gè)數(shù)組永票,該數(shù)組包括了所有在 array1 中但是不在任何其它參數(shù)數(shù)組中的值。注意鍵名保留不變。

如果需要得出簡(jiǎn)單差集瓦侮,可以通過(guò)如下方法:

$difference = array_merge(array_diff($a, $b), array_diff($b, $a));

4)入棧 array_push 與 出棧 array_pop

array_push() 將 array 當(dāng)成一個(gè)棧艰赞,并將傳入的變量壓入 array 的末尾佣谐。array 的長(zhǎng)度將根據(jù)入棧變量的數(shù)目增加肚吏。和$array[] = $var;效果相同。
Note: 如果用 array_push() 來(lái)給數(shù)組增加一個(gè)單元狭魂,還不如用 $array[] = 罚攀,因?yàn)檫@樣沒(méi)有調(diào)用函數(shù)的額外負(fù)擔(dān)。
Note: 如果第一個(gè)參數(shù)不是數(shù)組雌澄,array_push() 將發(fā)出一條警告斋泄。這和 $var[] 的行為不同,后者會(huì)新建一個(gè)數(shù)組镐牺。

array_pop() 彈出并返回 array 數(shù)組的最后一個(gè)單元炫掐,并將數(shù)組 array 的長(zhǎng)度減一。

5)array_pad — 以指定長(zhǎng)度將一個(gè)值填充進(jìn)數(shù)組
array array_pad ( array $array , int $size , mixed $value )
函數(shù)array_pad 返回 array 的一個(gè)拷貝睬涧,并用 value 將其填補(bǔ)到 size 指定的長(zhǎng)度募胃。如果 size 為正,則填補(bǔ)到數(shù)組的右側(cè)畦浓,如果為負(fù)則從左側(cè)開(kāi)始填補(bǔ)痹束。如果 size 的絕對(duì)值小于或等于 array 數(shù)組的長(zhǎng)度則沒(méi)有任何填補(bǔ)。有可能一次最多填補(bǔ) 1048576 個(gè)單元讶请。

$input = array(12, 10, 9);

$result = array_pad($input, 5, 0);
// result is array(12, 10, 9, 0, 0)

4祷嘶、數(shù)組的鍵與值

函數(shù) 說(shuō)明
array_count_values 統(tǒng)計(jì)數(shù)組中所有的值。返回一個(gè)數(shù)組:
數(shù)組的鍵是 array 里單元的值夺溢; 數(shù)組的值是 array 單元的值出現(xiàn)的次數(shù)
count 計(jì)算數(shù)組中的單元數(shù)目论巍,或?qū)ο笾械膶傩詡€(gè)數(shù)
array_values 返回?cái)?shù)組中所有的值,并給其建立數(shù)字索引风响。
array_keys 返回?cái)?shù)組中部分的或所有的鍵名
array_key_exists 檢查數(shù)組里是否有指定的鍵名或索引
in_array 檢查數(shù)組中是否存在某個(gè)值
array_search 在數(shù)組中搜索給定的值嘉汰,如果成功則返回首個(gè)相應(yīng)的鍵名

例1:返回?cái)?shù)組中所有的值并給其建立數(shù)字索引

$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array));
//上例會(huì)輸出:
Array
(
    [0] => XL
    [1] => gold
)

例2:返回?cái)?shù)組中部分的或所有的鍵名
array array_keys ( array $array [, mixed $search_value = null [, bool $strict = false ]] )
如果指定了可選參數(shù) search_value,則只返回該值的鍵名钞诡。否則 input 數(shù)組中的所有鍵名都會(huì)被返回郑现。

$array = array(0 => 100, "color" => "red");
print_r(array_keys($array));

$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));

// 以上例程會(huì)輸出:
Array
(
    [0] => 0
    [1] => color
)
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)

例3:在數(shù)組中搜索給定的值,如果成功則返回首個(gè)相應(yīng)的鍵名**
mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
大海撈針荧降,在大海(haystack)中搜索針( needle 參數(shù))接箫。
如果 needlehaystack 中出現(xiàn)不止一次,則返回第一個(gè)匹配的鍵朵诫。要返回所有匹配值的鍵辛友,應(yīng)該用 array_keys() 加上可選參數(shù) search_value 來(lái)代替。

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');
$key = array_search('green', $array);   // $key = 2;

例4:檢查數(shù)組里是否有指定的鍵名或索引**
bool array_key_exists ( mixed $key , array $array )
array_key_exists() 僅僅搜索第一維的鍵。 多維數(shù)組里嵌套的鍵不會(huì)被搜索到废累。

$search_array = array('first' => 1, 'second' => 4);
if (array_key_exists('first', $search_array)) {
    echo "The 'first' element is in the array";
}

5邓梅、數(shù)組生成器

函數(shù) 說(shuō)明
array_fill 用給定的值填充數(shù)組。生成數(shù)組
array_fill_keys 使用指定的鍵和值填充數(shù)組
range 根據(jù)范圍創(chuàng)建數(shù)組邑滨,包含指定的元素
array_combine 創(chuàng)建一個(gè)數(shù)組日缨,用一個(gè)數(shù)組的值作為其鍵名,另一個(gè)數(shù)組的值作為其值

例:

php > $a = array_fill(2, 5, 'banana');
php > print_r($a);
Array
(
    [2] => banana
    [3] => banana
    [4] => banana
    [5] => banana
    [6] => banana
)

php > $b = range(10, 100, 20);
php > print_r($b);
Array
(
    [0] => 10
    [1] => 30
    [2] => 50
    [3] => 70
    [4] => 90
)

php > $c = array_combine($b,$a);
php > print_r($c);
Array
(
    [10] => banana
    [30] => banana
    [50] => banana
    [70] => banana
    [90] => banana
)

6掖看、回調(diào)函數(shù)的應(yīng)用

函數(shù) 說(shuō)明
array_map 為數(shù)組的每個(gè)元素應(yīng)用回調(diào)函數(shù)
array_filter 用回調(diào)函數(shù)過(guò)濾數(shù)組中的單元
array_walk 使用用戶(hù)自定義函數(shù)對(duì)數(shù)組中的每個(gè)元素做回調(diào)處理
array_walk_recursive 對(duì)數(shù)組中的每個(gè)成員遞歸地應(yīng)用用戶(hù)函數(shù)匣距。
array_reduce 用回調(diào)函數(shù)迭代地將數(shù)組簡(jiǎn)化為單一的值

例1:array_map — 為數(shù)組的每個(gè)元素應(yīng)用回調(diào)函數(shù)
array array_map ( callable $callback , array $array1 [, array $... ] )
array_map():返回?cái)?shù)組,是為 array 每個(gè)元素應(yīng)用 callback函數(shù)之后的數(shù)組哎壳。 array_map() 返回一個(gè) array毅待,數(shù)組內(nèi)容為 array1 的元素按索引順序?yàn)閰?shù)調(diào)用 callback 后的結(jié)果(有更多數(shù)組時(shí),還會(huì)傳入 arrays 的元素)归榕。 callback 函數(shù)形參的數(shù)量必須匹配 array_map() 實(shí)參中數(shù)組的數(shù)量尸红。

function cube($n) {
    return ($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);

//結(jié)果如下:
Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

注意:傳入兩個(gè)及以上的數(shù)組時(shí),它們?cè)財(cái)?shù)量將會(huì)相同刹泄。因?yàn)榛卣{(diào)函數(shù)會(huì)并行地處理相互對(duì)應(yīng)的元素外里。 如果幾個(gè)數(shù)組的元素?cái)?shù)量不一致:空元素會(huì)擴(kuò)展短那個(gè)數(shù)組,直到長(zhǎng)度和最長(zhǎng)的數(shù)組一樣循签。

function show_Spanish($n, $m) {
    return "The number {$n} is called {$m} in Spanish";
}
$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro'];

$c = array_map('show_Spanish', $a, $b);
print_r($c);
//結(jié)果如下:
Array
(
    [0] => The number 1 is called uno in Spanish
    [1] => The number 2 is called dos in Spanish
    [2] => The number 3 is called tres in Spanish
    [3] => The number 4 is called cuatro in Spanish
    [4] => The number 5 is called  in Spanish
)

例2:array_filter — 用回調(diào)函數(shù)過(guò)濾數(shù)組中的單元
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次將 array 數(shù)組中的每個(gè)值傳遞到 callback 函數(shù)级乐。如果 callback 函數(shù)返回 true,則 array 數(shù)組的當(dāng)前值會(huì)被包含在返回的結(jié)果數(shù)組中县匠。數(shù)組的鍵名保留不變风科。

如果沒(méi)有提供 callback 函數(shù), 將刪除 array 中所有等值為 FALSE 的條目乞旦。

function odd($var) {
    return($var & 1);   // 奇數(shù)會(huì)返回1贼穆,偶數(shù)會(huì)返回0
}
function even($var) {
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));

//以上例程會(huì)輸出:
Odd :
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Even:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
)

callback 函數(shù)對(duì)于想保留的值返回true,對(duì)于不想保留的值返回false兰粉。

例3:array_walk — 使用用戶(hù)自定義函數(shù)對(duì)數(shù)組中的每個(gè)元素做回調(diào)處理
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
成功時(shí)返回 TRUE故痊, 或者在失敗時(shí)返回 FALSE。
Note: 如果 callback 需要直接作用于數(shù)組中的值玖姑,則給 callback 的第一個(gè)參數(shù)指定為引用愕秫。這樣任何對(duì)這些單元的改變也將會(huì)改變?cè)紨?shù)組本身。

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

function test_alter(&$item1, $key, $prefix) {
    $item1 = "$prefix : $item1";
}

function test_print($item2, $key) {
    echo "$key. $item2 <br />\n";
}

echo "Before ...:\n";
array_walk($fruits, 'test_print');
array_walk($fruits, 'test_alter', 'fruit');

echo "... and after:\n";
array_walk($fruits, 'test_print');
?>  

// 以上例程會(huì)輸出:
Before ...:
d. lemon
a. orange
b. banana
c. apple
... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple

注意:
array_walk_recursive() — 對(duì)數(shù)組中的每個(gè)成員遞歸地應(yīng)用用戶(hù)函數(shù)焰络。array_walk_recursive函數(shù)只將非數(shù)組元素傳遞到回調(diào)函數(shù)戴甩,所以從array_walk切換時(shí)不需要修改回調(diào)。

八闪彼、經(jīng)典實(shí)例

1甜孤、根據(jù)父ID獲取所有下級(jí)的子ID(子ID下面上可能還有子ID))

//測(cè)試數(shù)據(jù)
$data = [
        0=>['id'=>1,'name'=>'zhuangsan','pid'=>4],
        1=>['id'=>2,'name'=>'zhuangsan','pid'=>3],
        2=>['id'=>3,'name'=>'zhuangsan','pid'=>4],
        3=>['id'=>4,'name'=>'zhuangsan','pid'=>6],
        4=>['id'=>5,'name'=>'zhuangsan','pid'=>2],
        5=>['id'=>6,'name'=>'zhuangsan','pid'=>9]
];

/**
 * 遞歸獲取所有子id
 * @param $data 數(shù)據(jù)集
 * @param $pid 父id
 */
function select_tree($data,$pid){
    static $treeid = array();
    foreach($data as $key=>$val){
        if($pid==$val['pid']){
            $treeid[] = $val['id'];
            select_tree($data,$val['id']);
        }     
    }
    return $treeid;
}

$res = select_tree($data,4);
var_dump($res); 

//運(yùn)行結(jié)果:
root@Chan:~$ php demo11.php
array(4) {
  [0] =>
  int(1)
  [1] =>
  int(3)
  [2] =>
  int(2)
  [3] =>
  int(5)
}

注意: 此類(lèi)型題數(shù)據(jù)中不允許出現(xiàn)層級(jí)循環(huán),否則該遞歸方法將出現(xiàn)死循環(huán),程序報(bào)錯(cuò)缴川!
擴(kuò)展: 要求不使用遞歸茉稠,寫(xiě)出一個(gè)解決上題的方法。

2把夸、寫(xiě)一個(gè)函數(shù)而线,要求不使用array_merge完成多個(gè)數(shù)組的合并

$arr1 = ['2'=>'no',5=>100,3];
$arr2 = [1,2,3];
$arr3 = [1=>'a','b','c'];
function array_mer(){
        $return = [];
        $arrays = func_get_args();
        foreach($arrays as $arr){
                foreach($arr as $v){
                        $return[] = $v;
                }
        }
        return $return;
}
$arr = array_mer($arr1,$arr2,$arr3);
var_dump($arr);

結(jié)果如下(與array_merge函數(shù)返回的結(jié)果一樣):

array (size=9)
  0 => string 'no' (length=2)
  1 => int 100
  2 => int 3
  3 => int 1
  4 => int 2
  5 => int 3
  6 => string 'a' (length=1)
  7 => string 'b' (length=1)
  8 => string 'c' (length=1)

九、參考:

1扎即、官方文檔:

2吞获、相關(guān)書(shū)籍:

  • 《PHP經(jīng)典實(shí)例》 David Sklar & Adam Trachtenb
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末况凉,一起剝皮案震驚了整個(gè)濱河市谚鄙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刁绒,老刑警劉巖闷营,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異知市,居然都是意外死亡傻盟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)嫂丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娘赴,“玉大人,你說(shuō)我怎么就攤上這事跟啤》瘫恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵隅肥,是天一觀(guān)的道長(zhǎng)竿奏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腥放,這世上最難降的妖魔是什么泛啸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮秃症,結(jié)果婚禮上候址,老公的妹妹穿的比我還像新娘。我一直安慰自己种柑,他們只是感情好岗仑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著莹规,像睡著了一般赔蒲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天舞虱,我揣著相機(jī)與錄音欢际,去河邊找鬼。 笑死矾兜,一個(gè)胖子當(dāng)著我的面吹牛损趋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椅寺,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浑槽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了返帕?” 一聲冷哼從身側(cè)響起桐玻,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荆萤,沒(méi)想到半個(gè)月后镊靴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡链韭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年偏竟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞峭。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踊谋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旋讹,到底是詐尸還是另有隱情殖蚕,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布骗村,位于F島的核電站嫌褪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胚股。R本人自食惡果不足惜笼痛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琅拌。 院中可真熱鬧缨伊,春花似錦、人聲如沸进宝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)党晋。三九已至谭胚,卻和暖如春徐块,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灾而。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工胡控, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旁趟。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓昼激,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锡搜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橙困,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容