數(shù)組
php的數(shù)組十分特殊症脂,確切的說,它是由鍵值對構(gòu)成的數(shù)組,就類似于C++的map千扔,但是仍然可以用不帶鍵的序列去表示正常的數(shù)組。
創(chuàng)建數(shù)組
- $arr1 = array(key1=>value1,key2=>value2);
- $arr2 = array(value1,value2,value3);
- $arr3 = [key1=>value1,key2=>value2];
- $arr4 = [value1,value2,value3];
注意點:
- 其中數(shù)組的key可以寫库正,也可以不寫曲楚。
- 數(shù)組的key存在時,只能時integet或者string類型褥符,如果是其它類型龙誊,會自動強制轉(zhuǎn)換成integer類型或者string類型,但是value可以是任何類型。當數(shù)組沒有key時喷楣,會默認從下標0開始設(shè)置key
- 數(shù)組中相同的key的項趟大,后面的會覆蓋前面的。
- 數(shù)組可以同時存在帶key的項铣焊,和不帶key的項逊朽。不帶key的項,自動為key設(shè)置為int類型,且這個key的數(shù)字是根據(jù)自己左邊第一個key是int來決定的曲伊。假設(shè)這個數(shù)字是1叽讳,那么自己的key就默認是2,假設(shè)左邊沒有一個key是int的坟募,自己的key就是0(從當前位置向左找,不是直接從開頭找)
$arr1 = array(1,2,3,4);//不帶key的
print_r($arr1);//0=>1 1=>2 2=>3 3=>4
$arr2 = array(1=>"d",2=>"z",3=>"p");//全是帶key的
print_r($arr2);//1=>d 2=>z 3=>p
$arr3 = array("f1"=>1,"f2"=>2,2=>4,3,10=>"4");//混合存在key和不存在key的
print_r($arr3);//f1=>1 f2=>2 2=>4 3=>3 10=>4
/*----------key不是int/string類型的數(shù)組岛蚤,key自動轉(zhuǎn)換為int/string-----------*/
$arr4 = array(1.99=>1,1.1=>2,3,false=>"4");
print_r($arr4);//1.99被轉(zhuǎn)換為1,1.1也被轉(zhuǎn)換為1,所以后面的覆蓋前面的1=>2 false被轉(zhuǎn)換為0,所以0=>"4";
數(shù)組添加元素
添加元素的格式
- 數(shù)組變量[key] = value
添加元素的注意點
- 當數(shù)組中存在對應(yīng)的key時婿屹,那么它的value會被新插入的覆蓋灭美。
$arr = array(1=>"d",2=>"z");
print_r($arr)//1=>d 2=>z;
$arr[1] = "z";
print_r($arr);//1=>z 2=>z;
數(shù)組刪除元素
刪除元素的格式
- unset(數(shù)組變量[key]);
刪除元素的注意點
- 當數(shù)值刪除對應(yīng)的元素時,數(shù)組不會立馬重新排序昂利,原來的int類型的key還是保持原樣届腐。
- 如果需要讓數(shù)組刪除元素后铁坎,重新排序,需要用array_values(數(shù)組名)去將值拷貝到新數(shù)組里
數(shù)組變量);
$arr = array(1,2,3);
print_r($arr);
unset($arr[0]);
print_r($arr);//1=>2 2=>3
$newarr = array_values($arr);
print_r($newarr);//0=>2 1=>3
數(shù)組修改和查找元素
修改元素的格式
- 數(shù)組變量[key] = value
數(shù)組元素的修改就是利用覆蓋之前對應(yīng)key的值去修改犁苏。
查找數(shù)組的元素
- echo 數(shù)組變量[key];
$arr = array(1=>"d",2=>"z");
print_r($arr)//1=>d 2=>z;
$arr[1] = "z";
print_r($arr);//1=>z 2=>z;
echo($arr[1])//z;
數(shù)組的遍歷
數(shù)組的遍歷我們通常采用for循環(huán)遍歷和php自帶的foreach進行遍歷硬萍。
php也是有數(shù)組指針的,用來指向當前數(shù)組的元素的位置围详,下面列出幾個數(shù)組指針的函數(shù)
key(數(shù)組):獲取當前數(shù)組指針指向的key
current(數(shù)組):獲取當前數(shù)組指針指向的key
reset(數(shù)組):將當前數(shù)組指針指向第一位
next(數(shù)組):將當前數(shù)組指針下移一位
count(數(shù)組):返回數(shù)組元素個數(shù)
有了數(shù)組指針我們才可以用for遍歷關(guān)聯(lián)數(shù)組,下面分別是for和foreach遍歷索引數(shù)組和關(guān)聯(lián)數(shù)組,其中foreach數(shù)組的本質(zhì)就是逐個取出數(shù)組的每一個鍵值對
$arr1 = array(1,2,3,4);//索引數(shù)組
$arr2 = array("aaa"=>"123","bbb"=>"ddd");
//for循環(huán)遍歷索引數(shù)組
for($i=0;$i<count($arr1);$i++)
{
echo $arr1[$i];
}
//for循環(huán)遍歷關(guān)聯(lián)數(shù)組
reset($arr2);
for($i=0;$i<count($arr1);$i++)
{
echo key[$arr2]." ".current[$arr2];
next($arr2);
}
//foreach循環(huán)遍歷索引數(shù)組
foreach($arr1 as $key=>$value)
{
echo $key." ".$value;
}
//foreach循環(huán)遍歷索引數(shù)組
foreach($arr2 as $key=>$value)
{
echo $key." ".$value;
}
對比后朴乖,我們可以發(fā)現(xiàn)for遍歷索引數(shù)組方便,遍歷關(guān)聯(lián)數(shù)組還需要數(shù)組指針助赞,因為索引不是從0開始的买羞,而且它遍歷索引數(shù)組,還得要去索引數(shù)組是從0開始連續(xù)的雹食。而foreach進行數(shù)組遍歷畜普,不管索引數(shù)組還是關(guān)聯(lián)數(shù)組都是一套代碼完成的。因此我們更推薦使用foreach進行數(shù)組遍歷
數(shù)組的其它操作
list()將數(shù)組的值賦給多個變量
格式:
$arr = array(1,2,3,4,5);
list[$a,$b,$c] = $arr;//a = 1,b = 2,c = 3
注意點:
數(shù)組必須是索引從0開始的所以數(shù)組
array-values()
array-values(數(shù)組)將數(shù)組的所有值重新保存在一個新數(shù)組里群叶,返回值是一個保存數(shù)據(jù)的數(shù)組吃挑。
注意點:只會保存原來數(shù)組的值,新數(shù)組是一個索引從0開始的遞增數(shù)組街立。
$arr1 = array(2,3,4);
$newarr = array-values($arr1);
print_r($newarr);//0=>2 1=>3,2=>4;
array-keys()
array-keys(數(shù)組)將數(shù)組的所有鍵值key重新保存在一個新數(shù)組里舶衬,返回值是一個保存所有key的數(shù)組。
注意點:只會保存原來數(shù)組的key赎离,新數(shù)組是一個索引從0開始的遞增數(shù)組逛犹。
$arr1 = array("ddd"=>2,0=>3,"fff"=>4);
$newarr = array-keys($arr1);
print_r($newarr);//0=>ddd 1=>0,2=>fff;
array_key_exist()
array_key_exist(key,數(shù)組),用來判斷數(shù)組是否有這個key(鍵值),返回值是bool
$arr1 = array(2,3,4);
echo array_key_exist(1);//true
in_array()
in_array(value,數(shù)組),用來判斷數(shù)組是否有某個value值,返回值是bool
$arr1 = array(2,3,4);
echo array_key_exist(3);//true
array_search();
array_search(value,數(shù)組),用來判斷數(shù)組是否有某個value值,返回值是這個值的key
$arr1 = array(2,3,4);
echo array_search(3);//1
array_count_values();
array_count_values(數(shù)組),用來統(tǒng)計數(shù)組每個值出現(xiàn)的次數(shù),返回的是一個新數(shù)組蟹瘾,保存原數(shù)組每個值出現(xiàn)的次數(shù),因為新數(shù)組的鍵值就是原數(shù)組的value,所以待統(tǒng)計數(shù)組的value圾浅,必須是int/string類型的
$arr = array("aaa",1,"aaa","1","bbb");
$newarr = array_count_values($arr);
print_r($newarr);//arr=>2 1=>2 bbb=>1
array_unique()
array_unique(數(shù)組)掠手,用于刪除數(shù)組里重復出現(xiàn)值的項憾朴,后面重復出現(xiàn)的項會被刪除掉
$arr = array("aaa",1,"aaa","1","bbb");
$newarr = array_unique($arr);
print_r($newarr);//0=>arr,1=>1 2=>bbb;
range(起始,結(jié)束喷鸽,步長)
$arr = range(0,9);//創(chuàng)建一個起始從0到9的數(shù)組
print_r($arr);//0,1,2,3,4,5,6,7,8,9
array_sum(數(shù)組)
array_sum()//返回數(shù)組所有元素值的和
echo array_sum(array(1,2,3));//6
數(shù)組結(jié)合回調(diào)函數(shù)
通過回調(diào)函數(shù)把數(shù)組結(jié)合起來众雷,可以十分靈活的處理數(shù)組的數(shù)據(jù),既可以改變數(shù)組的數(shù)據(jù)做祝,又可以間接訪問數(shù)組的數(shù)據(jù)砾省。
array_filter(數(shù)組,回調(diào)函數(shù));
array_walk(數(shù)組混槐,回調(diào)函數(shù));
array_filter()用于過濾數(shù)組的元素编兄,其內(nèi)部的回調(diào)函數(shù)是返回值應(yīng)該是bool,返回值是一個數(shù)組,保存篩選后的元素
array_walk()是對數(shù)組每個元素進行不同的操作声登,比較靈活狠鸳。
//尋找偶數(shù)
function even($num)
{
if($num%2==0)
{
return true;
}else{
return false;
}
}
//加法,參數(shù)是飲用傳遞
function add1(&$num)
{
$num += 1;
}
$arr = array(1,2,3,4);
array_filter($arr,"even");//2,4
array_walk($arr,"add1");
print_r($arr);//2,3,4,5;
數(shù)組的排序
下面數(shù)組的排序都是直接操作原數(shù)組的
sort(數(shù)組);//按照值從小到大排序揣苏,原數(shù)組的鍵值被破壞。鍵值成為從0遞增
rsort(數(shù)組);//按照值從大到小排序件舵,原數(shù)組的鍵值被破壞卸察。鍵值成為從0遞增
$arr = array("bbb"=>10,"cc"=>9);
sort($arr);
print_r($arr);//0=>9 1=>10;
ksort(數(shù)組);//按照key從小到大排序
krsort(數(shù)組);//按照key從大到小排序
$arr = array("bbb"=>10,"cc"=>9);
ksort($arr);
print_r($arr);//bbb=>10 cc=>9;
asort(數(shù)組)//按照值從小到大排序,但是索引不會被破壞
arsort(數(shù)組)//按照值從大到小排序,但是索引不會被破壞
$arr = array("bbb"=>10,"cc"=>9);
asort($arr);
print_r($arr);//cc=>9 bbb=>10;
array_multisort(數(shù)組1,SORT_DESC/SORT_ASC铅祸,數(shù)組2坑质,SORT_DESC/SORT_ASC);//對多個數(shù)組進行值的升序或者降序排序临梗,每個數(shù)組后面的是升序或者降序
$arr1 = array(1,2,3);
$arr2 = array("bb","dd","aaa");
array_multisort($arr1,SORT_DESC,$arr2,SORT_ASC)//對arr1數(shù)組降序涡扼,arr2數(shù)組升序
print_r($arr1);//3 2 1
print_r($arr2);//aaa bb dd
數(shù)組模擬棧
array_push(數(shù)組,值):入棧盟庞,返回數(shù)組當前長度
array_pop():出棧壳澳,返回出棧元素
$arr18 = array(1,2,3);
array_push($arr18,4);
print_r($arr18);//1 2 3 4
array_pop($arr18);
print_r($arr18);//1 2 3
數(shù)組模擬隊列
array_shift(數(shù)組):出隊列,返回出隊列的值
array_push(數(shù)組茫经,元素):入隊列
$arr19 = array(1,2,3);
array_push($arr18,4);
echo array_shift($arr18);//1
print_r($arr19);//2 3 4