- 數(shù)組可以存儲(chǔ)任何數(shù)據(jù)罢坝。
array(1, 5, 1.1, "str", true);
$a=[123,123,213,213,21321,321,3];
- 鍵名設(shè)定:鍵名可以任意設(shè)定,無(wú)順序搅窿、無(wú)連續(xù)嘁酿。
array(2=>99, 5=>5, 3=>1.1, 0=>true);
- 分配規(guī)則:在未標(biāo)明鍵名的情況下,在前面最大數(shù)字下標(biāo)+1男应。
array(2=>11, 5, 1=>1.1, 'str', 0=>true); //下標(biāo)為:2,3,1,4,0
- 混合下標(biāo):鍵名可以為數(shù)字闹司,也可以字符混用。
array(2=>3, 'dd'=>5, 3=>1.1, 'girl'=>'str', 0=>true);
- 負(fù)數(shù)下標(biāo):負(fù)數(shù)的下標(biāo)會(huì)被識(shí)別為字符沐飘。
array(2=>1, -1=>true);
- 小數(shù)下標(biāo):小數(shù)下標(biāo)會(huì)自動(dòng)轉(zhuǎn)換為整數(shù)游桩。
array(2.7=>88, 1.987=>true); //2=>88, 1=>true
- bool下標(biāo):自動(dòng)轉(zhuǎn)換成
0牲迫、1
。 - 重復(fù)下標(biāo):會(huì)對(duì)前面相同的下標(biāo)進(jìn)行覆蓋借卧。
array(2=>88, 2=>true, 4=>1123); //2=>true, 1=>1123
- 數(shù)組分類(lèi)
- 關(guān)聯(lián)數(shù)組:通常指小標(biāo)為字符串盹憎,并且語(yǔ)義化的數(shù)組。
$person=[
"name"=>"小花",
"age"=>18,
"edu"=>"大學(xué)畢業(yè)",
]
- 索引數(shù)組:就是指數(shù)組下標(biāo)是從 0 開(kāi)始連續(xù)的數(shù)字下標(biāo)铐刘。
array(9) {
[0]=>int(121)
[1]=>int(15)
[2]=>int(10)
}
- 數(shù)組層次:
◇ 一維數(shù)組:
$arrs=(
"name"=>"小花",
"age"=>18,
"edu"=>"大學(xué)畢業(yè)"
)
◇ 二維數(shù)組:
<?php
$arrs=array(
"name"=>array("小花","小明","小芳"),
"age"=>array(17,18,19),
"edu"=>array("小學(xué)生","中學(xué)生","大學(xué)生")
);
echo "<pre>";
var_dump($arrs);
echo "</pre>";
◇ 多維數(shù)組:在二維數(shù)組的基礎(chǔ)上繼續(xù)延伸...
- 案例
- 一維數(shù)組求最大值:
<?php
$arr=[3,5,2,4,5,2,6,4,7,73];
$len=count($arr); //獲取長(zhǎng)度
$max=$arr[0]; //獲取初值
for($i=0;$i<$len;$i++){
if($max<$arr[$i]){
$max=$arr[$i]; //比較求值
}
}
echo $max; //73
- 二維數(shù)組求最大值:
<?php
$arr=[
[3,6,1,5,1],
[62,54,1,2,1,2,3],
[1,23,12,44,23]
];
$max=$arr[0][0]; //獲取初值
$len=count($arr); //獲取長(zhǎng)度
for($i=0;$i<$len;$i++){
$len2=count($arr[$i]); //獲取子數(shù)組的長(zhǎng)度
for($j=0;$j<$len2;$j++){ //嵌套循環(huán)
if($max<$arr[$i][$j]){
$max=$arr[$i][$j];//比較求值
}
}
}
echo $max; //62
▁ PHP 的數(shù)組陣列陪每,不可以在循環(huán)體直接操作,需要 & 引用符號(hào)镰吵。
數(shù)組的遍歷及原理
遍歷數(shù)組 foreach
的書(shū)寫(xiě)格式:
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
- 數(shù)組指針
每個(gè)數(shù)組內(nèi)部都有一個(gè) "指針"檩禾,用來(lái)決定取值時(shí)獲取的元素,像foreach
數(shù)組遍歷疤祭,都是依賴(lài) "指針" 完成的盼产。
piont.png - 操作函數(shù)
名稱(chēng) | 描述 |
---|---|
current() | 獲取 當(dāng)前 指向的元素的值 |
key() | 獲取 當(dāng)前 指向的元素的下標(biāo) |
next() | 將指針移到 下一個(gè)元素,并獲取元素的值 |
prev() | 將指針移到 上一個(gè)元素画株,并獲取元素的值 |
reset() | 將指針移到 第一個(gè)元素辆飘,并獲取元素的值 |
end() | 將指針移到 最后一個(gè)元素,并獲取元素的值 |
each() | 獲取 當(dāng)前 元素的 下標(biāo)和值谓传,然后將指針移動(dòng)到下一個(gè)位置 |
<?php
$people = array("張三", "李四", "王五", "馬六");
echo current($people) . "<br>"; //獲取當(dāng)前元素值:張三
echo next($people) . "<br>"; //移動(dòng)到下一個(gè)蜈项,并取值:李四
echo current($people) . "<br>"; //獲取當(dāng)前元素值:李四
echo prev($people) . "<br>"; //移動(dòng)到上一個(gè),并取值:張三
echo end($people) . "<br>"; //移動(dòng)到最后续挟,并取值:馬六
echo prev($people) . "<br>"; //移動(dòng)到上一個(gè)紧卒,并取值:王五
echo current($people) . "<br>"; //獲取當(dāng)前元素值:王五
echo reset($people) . "<br>"; //移動(dòng)到開(kāi)始,并取值:張三
echo next($people) . "<br>"; //移動(dòng)到下一個(gè)诗祸,并取值:李四
-
流程圖
foreach.png - 遍歷數(shù)組:
1.foreach
語(yǔ)法:
<?php
$arr=[ 3, "dd"=>2, 5,"news"=>45 ];
$max=reset($arr);
$key=0;
foreach ($arr as $k => $v){
if($v>$max){
$max=$v;
$key=$k;
}
}
echo "最大值為$max"."跑芳,下標(biāo)為$key";
2. for+next
語(yǔ)法:
<?php
$arr=[ 3, "dd"=>2, 5,"news"=>45 ];
$max=reset($arr);
$len=count($arr);
$key=0;
for($i=0;$i<$len;$i++){
$k=key($arr);
$v=current($arr);
if($v>$max){
$max=$v;
$key=$k;
}
next($arr);
}
echo "最大值為$max".",下標(biāo)為$key";
3. while+each+list
語(yǔ)法:
◇ each()
函數(shù):可以取得數(shù)組中一個(gè)元素的下標(biāo)和值直颅,并返回一個(gè)新的數(shù)組中博个,新數(shù)組將存儲(chǔ)四個(gè)元素。
<?php
$arr=[ 3, "dd"=>2, 5,"news"=>45 ];
$n1=each($arr);
echo "<pre>";
print_r($n1);
//輸出結(jié)果:
Array (
[1] => 3 //對(duì)應(yīng)下標(biāo) 0 的值
[value] => 3 //對(duì)應(yīng)下標(biāo) 0 的值
[0] => 0 //對(duì)應(yīng)下標(biāo) 0 的鍵
[key] => 0 ) //對(duì)應(yīng)下標(biāo) 0 的鍵
echo "</pre>";
$n2=each($arr);
echo "<pre>";
print_r($n2);
echo "</pre>";
//輸出結(jié)果:
Array (
[1] => 2 //對(duì)應(yīng)下標(biāo) dd 的值
[value] => 2 //對(duì)應(yīng)下標(biāo) dd 的值
[0] => dd //對(duì)應(yīng)下標(biāo) dd 的鍵
[key] => dd )//對(duì)應(yīng)下標(biāo) dd 的鍵
◇ list()
函數(shù):按照索引順序 0功偿、1盆佣、3、4... 取出對(duì)應(yīng)下標(biāo)的值放入變量中械荷。
<?php
$arr=[ 3, 4, 8, 10 ];
list($v1,$vv,$v2,$asd)=$arr;
echo $v1,$vv,$v2,$asd;
//3 4 8 10
結(jié)合遍歷:
reset($arr);
while(list($k,$v)=each($arr))//非空數(shù)組返回 true
//each 到數(shù)組最后會(huì)返回 false
{
//這里可以對(duì) $k $v 進(jìn)行操作
}
-
foreach
理解總結(jié) -
foreach
也是正常的循環(huán)語(yǔ)句共耍,可以使用break
、continue
吨瞎; - 遍歷過(guò)程中變量的傳值方式是值傳遞痹兜;
- 遍歷過(guò)程中可以認(rèn)為設(shè)定引用傳遞:
foreach($arr as $key => &$value){...}
- 遍歷過(guò)程中對(duì)數(shù)組進(jìn)行了修改、或某些指針型操作颤诀,則當(dāng)前循環(huán)不會(huì)得到體現(xiàn)字旭,即在復(fù)制的數(shù)組上繼續(xù)遍歷(原數(shù)組已經(jīng)修改)对湃;
-
foreach
中如果變量時(shí)引用傳遞,則一定會(huì)是在原數(shù)組上操作谐算。
▁ 數(shù)組的排序可以參考 排序算法熟尉。