- 數組可以存儲任何數據。
array(1, 5, 1.1, "str", true);
$a=[123,123,213,213,21321,321,3];
- 鍵名設定:鍵名可以任意設定,無順序、無連續。
array(2=>99, 5=>5, 3=>1.1, 0=>true);
- 分配規則:在未標明鍵名的情況下,在前面最大數字下標+1。
array(2=>11, 5, 1=>1.1, 'str', 0=>true); //下標為:2,3,1,4,0
- 混合下標:鍵名可以為數字,也可以字符混用。
array(2=>3, 'dd'=>5, 3=>1.1, 'girl'=>'str', 0=>true);
- 負數下標:負數的下標會被識別為字符。
array(2=>1, -1=>true);
- 小數下標:小數下標會自動轉換為整數。
array(2.7=>88, 1.987=>true); //2=>88, 1=>true
- bool下標:自動轉換成
0、1
。 - 重復下標:會對前面相同的下標進行覆蓋。
array(2=>88, 2=>true, 4=>1123); //2=>true, 1=>1123
- 數組分類
- 關聯數組:通常指小標為字符串,并且語義化的數組。
$person=[
"name"=>"小花",
"age"=>18,
"edu"=>"大學畢業",
]
- 索引數組:就是指數組下標是從 0 開始連續的數字下標。
array(9) {
[0]=>int(121)
[1]=>int(15)
[2]=>int(10)
}
- 數組層次:
◇ 一維數組:
$arrs=(
"name"=>"小花",
"age"=>18,
"edu"=>"大學畢業"
)
◇ 二維數組:
<?php
$arrs=array(
"name"=>array("小花","小明","小芳"),
"age"=>array(17,18,19),
"edu"=>array("小學生","中學生","大學生")
);
echo "<pre>";
var_dump($arrs);
echo "</pre>";
◇ 多維數組:在二維數組的基礎上繼續延伸...
- 案例
- 一維數組求最大值:
<?php
$arr=[3,5,2,4,5,2,6,4,7,73];
$len=count($arr); //獲取長度
$max=$arr[0]; //獲取初值
for($i=0;$i<$len;$i++){
if($max<$arr[$i]){
$max=$arr[$i]; //比較求值
}
}
echo $max; //73
- 二維數組求最大值:
<?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); //獲取長度
for($i=0;$i<$len;$i++){
$len2=count($arr[$i]); //獲取子數組的長度
for($j=0;$j<$len2;$j++){ //嵌套循環
if($max<$arr[$i][$j]){
$max=$arr[$i][$j];//比較求值
}
}
}
echo $max; //62
▁ PHP 的數組陣列,不可以在循環體直接操作,需要 & 引用符號。
數組的遍歷及原理
遍歷數組 foreach
的書寫格式:
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
- 數組指針
每個數組內部都有一個 "指針",用來決定取值時獲取的元素,像foreach
數組遍歷,都是依賴 "指針" 完成的。
piont.png - 操作函數
名稱 | 描述 |
---|---|
current() | 獲取 當前 指向的元素的值 |
key() | 獲取 當前 指向的元素的下標 |
next() | 將指針移到 下一個元素,并獲取元素的值 |
prev() | 將指針移到 上一個元素,并獲取元素的值 |
reset() | 將指針移到 第一個元素,并獲取元素的值 |
end() | 將指針移到 最后一個元素,并獲取元素的值 |
each() | 獲取 當前 元素的 下標和值,然后將指針移動到下一個位置 |
<?php
$people = array("張三", "李四", "王五", "馬六");
echo current($people) . "<br>"; //獲取當前元素值:張三
echo next($people) . "<br>"; //移動到下一個,并取值:李四
echo current($people) . "<br>"; //獲取當前元素值:李四
echo prev($people) . "<br>"; //移動到上一個,并取值:張三
echo end($people) . "<br>"; //移動到最后,并取值:馬六
echo prev($people) . "<br>"; //移動到上一個,并取值:王五
echo current($people) . "<br>"; //獲取當前元素值:王五
echo reset($people) . "<br>"; //移動到開始,并取值:張三
echo next($people) . "<br>"; //移動到下一個,并取值:李四
-
流程圖
foreach.png - 遍歷數組:
1.foreach
語法:
<?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".",下標為$key";
2. for+next
語法:
<?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".",下標為$key";
3. while+each+list
語法:
◇ each()
函數:可以取得數組中一個元素的下標和值,并返回一個新的數組中,新數組將存儲四個元素。
<?php
$arr=[ 3, "dd"=>2, 5,"news"=>45 ];
$n1=each($arr);
echo "<pre>";
print_r($n1);
//輸出結果:
Array (
[1] => 3 //對應下標 0 的值
[value] => 3 //對應下標 0 的值
[0] => 0 //對應下標 0 的鍵
[key] => 0 ) //對應下標 0 的鍵
echo "</pre>";
$n2=each($arr);
echo "<pre>";
print_r($n2);
echo "</pre>";
//輸出結果:
Array (
[1] => 2 //對應下標 dd 的值
[value] => 2 //對應下標 dd 的值
[0] => dd //對應下標 dd 的鍵
[key] => dd )//對應下標 dd 的鍵
◇ list()
函數:按照索引順序 0、1、3、4... 取出對應下標的值放入變量中。
<?php
$arr=[ 3, 4, 8, 10 ];
list($v1,$vv,$v2,$asd)=$arr;
echo $v1,$vv,$v2,$asd;
//3 4 8 10
結合遍歷:
reset($arr);
while(list($k,$v)=each($arr))//非空數組返回 true
//each 到數組最后會返回 false
{
//這里可以對 $k $v 進行操作
}
-
foreach
理解總結 -
foreach
也是正常的循環語句,可以使用break
、continue
; - 遍歷過程中變量的傳值方式是值傳遞;
- 遍歷過程中可以認為設定引用傳遞:
foreach($arr as $key => &$value){...}
- 遍歷過程中對數組進行了修改、或某些指針型操作,則當前循環不會得到體現,即在復制的數組上繼續遍歷(原數組已經修改);
-
foreach
中如果變量時引用傳遞,則一定會是在原數組上操作。
▁ 數組的排序可以參考 排序算法。