在php數組中有三種類型:數值數組 帶有數字 ID 鍵的數組 關聯數組 數組中的每個 ID 鍵關聯一個值 多維數組 包含一個或多個數組的數組,好了現在來看我的筆記吧.
實例代碼如下:
- header('Content-Type: text/html; charset=utf-8');
- echo '<pre>';
- function var_array($array)
- {
- echo '<pre>';
- var_dump($array);
- echo '</pre>';
- }
- function printr($array)
- {
- echo '<pre>';
- print_r($array);
- echo '</pre>';
- }
- function getArr($sNum, $eNum=1, $step=1)
- {
- $arr = range($sNum, $eNum, $step);
- $reArr = array();
- foreach($arr as $v)
- {
- $reArr[$v] = rand(0,10);
- }
- unset($arr);
- return $reArr;
- }
- /**
- * array數組練習
- */
- //---------------------------------------------
- //array_change_key_case() 改變數組索引的大小寫字母,由最后一個參數決定:CASE_UPPER(轉化為大寫),CASE_LOWER(默認 轉化為小寫)
- $expArr = array(
- 'fiRsT' => '1',
- 'sEcoNd' => '2',
- 'ThIrd' => array(
- 'HuiMa' => '3',
- 'nengZhuaNma' => '5',
- )
- );
- printr(array_change_key_case($expArr));//全轉化為小寫
- printr(array_change_key_case($expArr['ThIrd'], CASE_UPPER));//全轉化為大寫 只對$expArr數組里的某個index鍵轉化
- //總結:該函數只影響數組的一層. 并且不會對原數組產生影響
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_chunk($array, $size, false)
- //將一個數組分割成一個多維數組,size決定這個數組每$size個成為一個多維數組, true/false決定新數組的鍵值是否沿用原數組的鍵
- $expArr = array('4','2','6','d','2');
- printr(array_chunk($expArr, 3));
- //總結:該函數只影響數組的一層. 并且不會對原數組產生影響
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_combine($keyArr, $valArr)
- //將兩個數組組合成一個數組,$keyArr做為鍵,$valArr做為值
- $expKey = array('g', 'd', 't');
- $expVal = array('5', '8', '7');
- printr(array_combine($expKey, $expVal));
- //該函數同樣只影響數組的一層,并且返回一個新數組
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_count_values($array)
- //統計$array數組中每個value出現的次數,并以他個value做為新數組的鍵,出現次數做為value
- $array = array('v1'=>'265', 'v2'=>'352', 'v3'=>'265', 'v4'=>'349', 'v5'=>'265');
- printr(array_count_values($array));
- //總結:該函數只能用于統計值為 string和integer類型的value,其他類型會發warning!
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_diff($array1, $array2...)
- //以$array1為基礎數組,他的值不出現在其他任何參數數組里的值組成一個新數組
- $arr1 = array('v4'=>458, 'gren', 'b5', 'a5');
- $arr2 = array('v4'=>598, 'red', 'a5', 'c4');
- printr(array_diff($arr1, $arr2));
- //總結:拿一個數組到一堆數組中找出這個數組中沒有的值,統計、數據對比應該會用到
- //array_intersect($array, $parArr, ....)
- //該函數同array_diff在功能上一樣,只是array_intersect()返回的是共有的數據,array_diff則是只存在于$array中的數據
- //
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_diff_assoc($array1, $array2...)
- //同 array_diff()函數,但是這個也會拿key進行對比
- //
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_diff_key
- //同array_diff()函數
- //只是這個只拿$array1的key去與其他參數數組進行查找
- //
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_diff_uassoc($arr1, $parArr...., 回調函數)
- //功能同array_diff(),但是需要用戶定義一個回調函數
- //未明白該函數的作用
- //
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_diff_ukey($arr1, $parArr...., 回調函數)
- //功能同array_diff_key(),只不過和array_diff_uassoc一樣,需要一個回調函數
- //
- //
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_fill($startInt, $numInt, $value)
- //把$value填充到一個新數組,新數組的索引起始位置開始由$startInt決定,$numInt則控制這個數組生成多少個索引.
- //tip:除了$value,$startInt,$numInt必須為數字,否則報錯
- printr(array_fill(2, 5, 'value'));
- //總結:還沒想到干啥用
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_fill_keys($arrKeys, $value);
- //功能同array_fill()函數.只不過這里用$arrKeys【一個數組的值】來做為新數組的鍵
- $arrKeys = array('45', 'd', 'b', 'c');
- printr(array_fill_keys($arrKeys, 'value'));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_filter($arr, callBack回調函數)
- //過濾函數,通過對$arr數組的值的判斷,如果 callBack回調函數 返回true,則將當前鍵以及值添加到新的數組里
- //TIP:回調函數可以寫個規則,來過濾掉里邊不符合規則的數組鍵
- function cb($val)
- {
- return $val%2 == 0;
- }
- $array = array('k1'=>3, 'k2'=>5,'k4'=>54654, 'k5'=>8794, 8945, 32549564);
- printr($array, 'cb');
- //tip:回調函數名建議用引號引起來
- //總結:該方法可以做成一個數據過濾的集成
- unset($array);
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_flip($array)
- //將數組中key和value的關系轉換.只支持string和integr類型的鍵,其他類型將會發出警告,并且有問題的鍵值不轉換.在生成的新的數組,如果鍵相同,他會不停的替換掉現有鍵的值
- $arr = array('k1'=>'v1', 'k2'=>'v2', 'k3'=>'v4', 'k4'=>'v4', 'k5'=>'v5');
- printr(array_flip($arr));
- unset($arr);
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_key_exists($key, $array)
- //判斷一個鍵是否存在于當前數組中,返回bool.也可用來判斷對象
- $array = array('cb' => 234, 'dv'=>45, 'one'=>897);
- if(array_key_exists('one', $array))
- echo '存在這個數組中';
- else
- echo '不存在';
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_keys($array, $selSearch_value)
- //返回數組中的鍵名并組成一個新數組,如果指定了$selSearch_value值,那么將返回數組里等于$selSearch_value的鍵名
- $array = getArr(4, 10);
- printr(array_keys($array));
- printr(array_keys($array, '5'));//帶值的搜索
- unset($array);
- //總結:這個也可用于數據統計,數據對比驗證
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- echo 'array_map:';
- //array_map('callBack', $array,...)
- //把傳入的函數,返回經callback回調函數的返回值
- //回調函數也可以返回一個數組.并且,回調函數只接受一個數組里的值傳入
- function mapCb($n)
- {
- return $n*$n*$n;
- }
- $array = getArr(4, 15);
- printr(array_map('mapCb', $array));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_merge($array,$array2...)
- //將多個數組組成一個數組,并對數字索引進行重新編寫.
- $arr1 = getArr(1, 5);
- $arr2 = getArr(5, 10);
- printr(array_merge($arr1, $arr2));
- //總結:將多個數組組成一個新數組.
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_merge_recursive($arr1, $arr2....)
- //功能同上.但函數會將鍵名相同的值組成一個新數組,而不是替換掉
- //但如果要用,根據實際情況使用
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_multisort()
- //多維數組排序,目前只實現了二維數組排序.三維估計不能排
- //該函數會直接改變員數組順序
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_pad($arr, $size, $value)
- //對數組進行填充,如果當前$arr的長度小于$size,那么,就用$value來填充$arr數組,直至$arr的長度與$size相等
- //如果$arr的長度大于或等于$size,那么該函數將不會對$arr進行填充. $size小于0則填充在$arr的左邊,大于0則右邊
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_pop($array)
- //去掉數組的最后一個鍵.
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_product($arr)
- //返回一個數組中所有數值的乘積.
- //tip:該函數無法處理非數值類型的數據.如果傳入數組里包含‘a、b之類字符串',那么php會報錯
- $arr = array(4,5,5);
- echo array_product($arr);
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_push($arr, $keyArr)
- //將$keyArr添加到$arr數組的末尾,以key/棧的形式添加.
- //與array_merge()、array_merge_recursive()兩函數的區別:
- // arrap_push()是將一個$keyArr添加到$arr里邊,而其他兩個函數則是將多個函數連接成一個函數
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_rand($arr, $num=1)
- //取出當前數組里的鍵,取出幾個由$num決定,默認為1
- //如果$num為1,那么它將返回一個string
- //如果$num>1 && $num<count($arr) 函數返回一個數組
- //否則php報錯
- $arr = getArr(5, 15);
- printr(array_rand($arr, 4));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_reduce()
- //和array_map()類似,通過回調函數,對數組里的數值進行處理,并接受返回值
- //該函數返回一個字符串.他會將數組里所有的值進行計算,并返回計算后的值,而array_map則是對每個鍵下的值進行計算,并返回array
- //不是太明白,實例看手冊
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_replace($array, $parArr,...)
- //用參數數組里鍵的值替換掉$array里相同鍵的值
- //如果$array數組里在后邊的參數數組里沒有找到相應的鍵,那么添加到新數組后邊
- /*$arr = getArr(4, 10);
- $arr2 = getArr(6, 15);
- printr($arr);
- printr($arr2);*/
- $base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
- $replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));
- printr(array_replace($base, $replacements));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_replace_recursive() 遞歸替換
- //功能同array_replace()一樣.區別在于:array_replace_recursive()可以對多維數組操作,并且不改變$array的結構,而array_replace()他最終會返回一個一維數組
- $base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
- $replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));
- printr(array_replace_recursive($base, $replacements));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_reverse($arr)
- //將數組里的鍵按相反順序排列
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_search($value, $array)
- //在$array數組中去找值為$value的鍵名
- //沒有找到則返回false
- //如果$array數組鴻有多個$value,那么只返回第一個匹配的鍵
- //該函數與array_keys()類似,區別在于返回值上:array_search()只會返回一個匹配的鍵名,而array_keys()則可以返回一個由所有匹配的鍵組成的一維數組
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_shift($arr)
- //去掉當前$arr數組里的第一個鍵,并且對后邊的數字索引進行重新編排(但不改變原有順序),非數字索引不變.
- //該函數與array_pop()類似,區別在于array_pop()去掉是最后一個,array_shift()去掉腦袋
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_slice($arr, $offset, $length=0, false) 數組截取
- //返回當前$arr數組里從$offset處開始偏移,共$length個元素/鍵,并組成一個新數組返回
- //如果$offset或者$length為負數,那么就是向相反方向進行偏移
- //感覺和substring()字符串截取類似
- //直接用php手冊上的實例了
- $input = array("a", "b", "c", "d", "e");
- $output = array_slice($input, 2); // returns "c", "d", and "e"
- $output = array_slice($input, -2, 1); // returns "d"
- $output = array_slice($input, 0, 3); // returns "a", "b", and "c"
- // note the differences in the array keys
- printr(array_slice($input, 2, -1));
- printr(array_slice($input, 2, -1, true));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_spslice($arr, $offset, $length)
- //同array_slice()函數正好相反,該函數是去掉位于$offset和$length之間這些元素
- unset($arr);
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_sum($arr)
- //將$arr數組里的所有值進行求和累加,如果是非數值類型的則嘗試進行轉換,但是大部分轉換后為0
- //該函數只會影響一層數組,和array_product()類似
- $arr = array(
- 45,56, 'a', 'b'=>getArr(1, 2),
- );
- printr($arr);
- echo 'array_sum($arr)',array_sum($arr);
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_values($arr)
- //將$arr數組里的值提取出來,組成新的數組
- $arr = array(
- 'k1'=>45,'k2'=>56, 'k3'=>'a', 'b'=>getArr(1, 2),
- );
- printr(array_values($arr));
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_unique($arr) 對數組進行排重
- //對$arr數組進行排重,將重復的值進行過濾.多個相同的值將只保留第一個
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_walk($arr, callback[回調函數], $sel_perfix='')
- //對當前數組下的每個鍵進送到 callback函數里進行處理
- //如果加上$sel_perfix參數,回調函數也要三個參數來接收,否則報錯
- //該函數只影響一層
- $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
- function test_alter(&$item1, $key, $prefix)
- {
- $item1 = "$prefix: $item1";
- }
- printr(array_walk($fruits, 'test_print'));
- array_walk($fruits, 'test_alter', 'fruit');
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //array_walk_recursive()
- //功能類似于array_alk();但是他會遞歸$arr的每一層數組,返回的數組不會改變原有數組的結構
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //arsort($arr)
- //按照數組鍵名排序數組,可以對字母進行排序.如果排序失敗,將返回null
- echo '<br/><hr/><br/>';
- //---------------------------------------------
- //asort()
- //功能類似于arsort(),區別在于:asort()是對值進行排序
- 數組循環
- 實例代碼如下:
- foreach ($array as $value) {
- echo $value;
- }
- while (list($key) = each($array)) {
- echo $array[$key];
- }
- foreach ($array as $value) {
- echo $value;
- }
- while (list($key) = each($array)) {
- echo $array[$key];
- }
在循環里進行的是數組“寫”操作,則while比foreach快:
實例代碼如下:
- foreach ($array as $key => $value) {
- echo $array[$key] = $value . '...';
- }
- while (list($key) = each($array)) {
- $array[$key] = $array[$key] . '...';
- }
- foreach ($array as $key => $value) {
- echo $array[$key] = $value . '...';
- }
- while (list($key) = each($array)) {
- $array[$key] = $array[$key] . '...';
- }
總結:通常認為,foreach涉及到值復制,一定會比while慢,但實際上,如果僅僅是在循環里進行數組的讀操作,那么foreach是很快的,這是因為PHP采用的復制機制是“引用復制,寫時拷貝”,這樣看來,foreach的高效讀操作就不難理解了.
另外,既然foreach不適合處理數組寫操作,那么我們可以得出一個結論,多數情況下,類似foreach ($array as $key => $value)形式的代碼都應該被替換成while (list($key) = each($array)).
新聞熱點
疑難解答