----- 最后更新【2022-01-09】-----
本文目錄結(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ì)于任意 integer
,float
哥捕,string
牧抽,boolean
和 resource
類(lèi)型,如果將一個(gè)值轉(zhuǎn)換為數(shù)組遥赚,將得到一個(gè)僅有一個(gè)元素的數(shù)組扬舒,其下標(biāo)為 0,該元素即為此標(biāo)量的值凫佛。換句話(huà)說(shuō)讲坎,(array) $scalarValue
與 array($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ù))接箫。
如果 needle
在 haystack
中出現(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扎即、官方文檔:
- Array 數(shù)組類(lèi)型:http://php.net/manual/zh/language.types.array.php
- 數(shù)組函數(shù):http://php.net/manual/zh/ref.array.php
- 數(shù)組操作符:https://www.php.net/manual/zh/language.operators.array.php
- 對(duì)數(shù)組進(jìn)行排序:https://www.php.net/manual/zh/array.sorting.php
2吞获、相關(guān)書(shū)籍:
- 《PHP經(jīng)典實(shí)例》 David Sklar & Adam Trachtenb