如何在不使用系统函数的情况下实现PHP中数组系统函数的功能

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是因为第二次循环不需要验证最后一位,

第三次循环不需要验证最后二位,依次类推。

以上就是不用系统函数实现系统函数的功能的方式。

时间: 2024-08-24 06:09:54

如何在不使用系统函数的情况下实现PHP中数组系统函数的功能的相关文章

保留键的情况下取字典中最大的值(max\zip函数的联合使用)

在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age2":6,"age2":100} v1 = max(testDict.values()) print(v1) #打印结果为100 这样已经达到了获取最大值的目的,但是这样就丢失了key.要如何保留key呢,这就需要用到zip函数 zip函数的作用是将两个序列以顺序对应起来,最后生

在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应的checkbox后  点删除按钮------------- <!-- *******************删除******************* -->     <input type="image" alt="delete"      src=&

编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组

建议16:元素数量可变的情况下不应使用数组 在C#中,数组一旦被创建,长度就不能改变.如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建. 而数组本身,尤其是一维数组,在遇到要求高效率的算法时,则会专门被优化以提升其效率.一维数组也成为向量,其性能是最佳的,在IL中使用了专门的指令来 处理它们(如newarr.ldelem.ldelema.ldelen和stelem). 从内存的使用角度来讲,数组在创建时被分配了一段固定长度的内存.如果数组的元素是值类型,

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数.static定义的类的成员函数就是一个全局函数. 更多 参考  http://blog.csdn.net/ksn13/article/details/40538083 #include <pthread.h> #

DeskMini无传统机械键盘与鼠标接口的情况下使用U盘安装系统经验总结

总结安装纯净版Win7旗舰版系统安装过程所解决的问题要点: 1:UEFI引导启动的实现. 2:使用Dism++实现系统的安装. 3:使用Dism++解决新主板在安装系统过程中不能使用USB键盘和鼠标的问题. 解决过程: 准备工作: 去MSDN网站下载Win7SP1纯净版的ISO文件.(Windows 7 Ultimate with Service Pack 1 (x64) - DVD (Chinese-Simplified) : ed2k://|file|cn_windows_7_ultimat

C/C++中数组作为函数形参后退化为指针

最近写了一个函数,把数组作为了它的参数,在这个函数中用到了这个数组的长度,按照正常的求长度的方式,应该不会出错:但是运行之后发现结果却不是我想要的.于是写了一个测试程序来验证我的猜想. #include <iostream> using namespace std; void Sort(int nSortArray[6]) { int nLen = sizeof(nSortArray) / sizeof(nSortArray[0]); int nTmp = 0; for (int i = 0;

js中数组迭代函数—(1)不生成新数组

不生成新数组的迭代器方法,它们要么对于数组中的每个元素执行某种操作, 要么返回一个值. 1.forEach(), 该方法接受一个函数作为参数, 对数组中的每个元素使用该函数 <script type="text/javascript"> function square(num) { document.write(num * num+"\t"); } function doEach(){ var nums = [1, 2, 3, 4, 5, 6, 7, 8

在不使用数组函数的情况下实现数组排序

想到的是两种方法,第一种是 $array = array(1,3,10,4,6,9,7,5,8); $new_arr = $tmp = array(); $count = count($array); for($i=0; $i<$count; $i++) { $key = 0; for($j = 0; $j < $count; $j++) { if(isset($array[$j]) && ($array[$i] < $array[$j])) { $key++; } }

js中数组迭代函数—(2)会生成新数组

有两个迭代器方法可以产生新数组: map() 和 filter(). 1.map(),map() 和 forEach() 有点儿像, 对数组中的每个元素使用某个函数. 两者的区别是 map() 返回一个新的数组, 该数组的元素是对原有元素应用某个函数得到的结果. <script type="text/javascript"> function curve(grade) { return grade += 5; } function doMap() { var grades