1. 程式人生 > >如何在不使用系統函數的情況下實現PHP中數組系統函數的功能

如何在不使用系統函數的情況下實現PHP中數組系統函數的功能

如何 利用 數組 關聯 uniq 出現的次數 回調 數組賦值 fun

PHP中為我們提供了各種各樣的系統函數來實現我們需要的各種功能,那麽,在不使用系統函數的情況下我們要怎樣來實現這些功能呢?以下就是幾種系統函數的實現方式。

首先,我們來定義一個數組:

$arr= array(1,2,3,4,5,6,"a"=>7,"b"=>8,"c"=>"haha",10);

以下是對於這個數組可以使用的系統函數和不使用系統函數獲得同樣效果的方式:

1.返回數組的所有的值,返回數組。(array_values($arr))

這個功能要實現很簡單,只需要將函數的值用foreach取出來賦給新數組就可以了。以下就是實現代碼:

function getValue($arr){
    $arr1 = array();
    foreach($arr as $key=>$value){
        $arr1[]=$value;
    }
    return $arr1;
}
getValue($arr);

這樣,我們就取出了$arr的所有值。

2.返回數組的所有的鍵,返回數組。(array_keys($arr))

這一函數和上一函數的實現方式基本相同,只需要把賦給$arr1的值改成$arr的鍵就可以了。代碼如下:

function getKey($arr){
    $arr1 = array();
    foreach($arr as $key=>$value){
        $arr1[]=$key;
    }
    return $arr1;
}
getKey($arr);

這樣就能取出數組的所有鍵。

3.檢測數組中是否包含某個值,返回真假,輸入true判斷條件是===,false是==。(in_array("8", $arr,true))

這個函數也很簡單,把參數傳到函數中,分別和數組中的每一個值比較,發現相同的話就返回true,到最後也沒發現就返回false。以下是代碼:

function test($num,$arr,$isTrue=true){
foreach($arr as $key=>$value){
if($isTrue){
if($num===$value){
return true;
}
}else{
if($num==$value){
return true;
}
}
}
return false;
}

這個函數需要第三個參數,來判斷檢測條件是==還是===,本做法將$isTrue默認設置為true即如果不傳入第三個參數則默認判斷條件為===。

4.交換數組中的鍵和值,返回交換後的新數組。(array_flip($arr))

這個函數的實現思路和前兩個一樣,用foreach循環將數組的鍵作為新數組的值,將數組的值作為新數組的鍵。代碼如下:

function change($arr){
    $arr1 = array();
    foreach($arr as $key=>$value){
        $arr1[$value]=$key;
    }
    return $arr1;
}
change($arr);

本函數只需要 $arr1[$value]=$key;就能實現鍵值交換。

5.統計數組元素個數。(count($arr))

代碼如下:

function num($arr){
    $i=0;
    foreach($arr as $key=>$value){
        $i++;
    }
    return $i;
}
num($arr);

6.統計數組中所有值出現的個數,返回一個新數組。(array_count_values($arr))
新數組格式:鍵-->原數組的值(去重後的值)
值-->原數組中對應的值出現的次數。

function check($arr){
    $arr1=array();
    foreach($arr as $key => $value){
        $isHas=true;
        foreach($arr1 as $key1=>$value1){
            if($key1==$value){
                $arr1[$value]++;
                $isHas=false;
            }
        }
        if($isHas){
            $arr1[$value]=1;
        }
    }
    return $arr1;
}
check($arr);

實現思路:

1.有一個空數組arr1:鍵-->原數組去重的值 值-->原數組每個值出現的次數
2.遍歷原數組arr,並取出arr中的每一個值;
3.檢測:新取出的值是否在arr1中有一個同名的鍵。
如果有,說明找到了與現在新取值相重復的值,那麽就把arr1中的這個
鍵對應的值+1;
如果沒有,說明截止到現在,還沒有與新取出的值重復的項,那麽在arr1
中新建一個同名的鍵,讓值為1;

7.移除數組中重復的值。(array_unique($arr))

本函數比較簡單的實現方式是將鍵值互換兩次,重復的值就可以利用同名鍵的值會被後面的替代這一原理消除掉,但是這種方式只能用於索引數組,用於關聯數組時會出現鍵也被刪掉的bug。代碼如下:

function delete($arr){
    $a=array();
    $b=array();
    foreach($arr as $key=>$value){
        $a[$value]=$key;
    }
    foreach($a as $key1=>$value1){
        $b[$value1]=$key1;
    }
    return $b;
}
delete($arr);

8.過濾數組中的每一個值:
① 不傳回調函數: 過濾掉所有空值(0/""/null/false/"0"/[])
② 傳回調函數:需要給回調函數傳遞一個參數,判斷參數是否符合要求,如果符合,return true;否則,return false;

代碼如下:

function filterArray($arr,$func=false){
    $newArr = array();
    if($func==FALSE){
        echo "沒有回調函數,應該去除空值!";
        foreach ($arr as $key => $value) {
            if($value){
                $newArr[$key] = $value;
            }
        }
    }else{
        echo "有回調函數,應該按照回調函數過濾!";
        foreach ($arr as $key => $value) {
            if($func($value)){
                $newArr[$key] = $value;
            }
        }
    }
    return $newArr;
}
filterArray($arr,function($value){
    if($value>5){
        return true;
    }else{
        return false;
    }
});

函數的第二個形參可以判斷是否有回調函數傳入,沒有執行最外層if,有的話執行最外層else,由於空值在if判斷條件中是false,將其作為判斷條件就可以在為新數組賦值時將其跳過

最外層else中if的判斷條件是回調函數返回的值是true或false,這樣就能實現用自己設定的條件篩選。

9.對數組排序(升序)。

本函數用了冒泡排序的思路,本函數只需要排數字,因此,重新定義一個數組

$arr=[1,7,140,3,10,12,134,239,453,24,56,34,78,53,56];

代碼如下:

function paiXu($arr){
    $len = count($arr);
    for($x=0;$x<$len-1;$x++){
        for($y=0;$y<$len-$x-1;$y++){ 
            if($arr[$y]>$arr[$y+1]){
                $old=$arr[$y];            
                $arr[$y]=$arr[$y+1];
                $arr[$y+1]=$old;    
            }
        }
    }
    return $arr;
}
paiXu($arr);

內層循環實現的公能:

兩兩比對,大的往後挪,小的往前移(即如果$arr[y]>$arr[y+1],$arr[y]與$arr[y+1]調換位置),就可以把最大的移到最後,這裏的$y<$len-$x-1是因為第二次循環不需要驗證最後一位,

第三次循環不需要驗證最後二位,依次類推。

以上就是不用系統函數實現系統函數的功能的方式。

如何在不使用系統函數的情況下實現PHP中數組系統函數的功能