如何在不使用系统函数的情况下实现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是因为第二次循环不需要验证最后一位,
第三次循环不需要验证最后二位,依次类推。
以上就是不用系统函数实现系统函数的功能的方式。
如何在不使用系统函数的情况下实现PHP中数组系统函数的功能的更多相关文章
- 保留键的情况下取字典中最大的值(max\zip函数的联合使用)
在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age ...
- 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static
在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create ...
- 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法
在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应 ...
- 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组
建议16:元素数量可变的情况下不应使用数组 在C#中,数组一旦被创建,长度就不能改变.如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建. 而数组本身 ...
- DeskMini无传统机械键盘与鼠标接口的情况下使用U盘安装系统经验总结
总结安装纯净版Win7旗舰版系统安装过程所解决的问题要点: 1:UEFI引导启动的实现. 2:使用Dism++实现系统的安装. 3:使用Dism++解决新主板在安装系统过程中不能使用USB键盘和鼠标的 ...
- php中数组操作函数
一.数组操作的基本函数数组的键名和值array_values($arr); 获得数组的值array_keys($arr); 获得数组的键名array_flip($arr); 数组中的值与键名互换 ...
- C语言中数组做函数参数的问题
数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...
- 系统在某些情况下会自动调节UIScrollView的contentInset
出现情景 如果一个控制器(ViewController)被导航控制器管理,并且该控制器的第一个子控件是UIScrollView,系统默认会调节UIScrollView的contentInset UIE ...
- 定点分析: MySQL InnoDB是如何保证系统异常断电情况下的数据可靠性?
MySQL支持事务,所以保证数据可靠的前提是对数据的修改事务已经成功提交 这个问题可以解释为'MySQL InnoDB是如何保证事务C(一致性)D(持久性)性的?' 可能出现的两种情况: (一致性)数 ...
随机推荐
- iOS各框架功能简述以及系统层次结构简单分析
iOS各个框架所对应的功能简单介绍 iOS系统结构层次:
- 关于generator异步编程的理解以及如何动手写一个co模块
generator出现之前,想要实现对异步队列中任务的流程控制,大概有这么一下几种方式: 回调函数 事件监听 发布/订阅 promise对象 第一种方式想必大家是最常见的,其代码组织方式如下: fun ...
- kindeditor扩展粘贴图片功能&修改图片上传路径并通过webapi上传图片到图片服务器
前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...
- 腾讯云上Selenium用法示例
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 前言 在上一节我们学习了PhantomJS 的基本用法,归根结底它是一个没有界面的浏览器,而且运 ...
- git工具使用的简单介绍
百度百科 写道 Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大 ...
- AngularJS学习笔记2
3.AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}.AngularJS 表达式把数据绑定到 HTML,这与 ng-bind 指令有异曲同工之妙. ...
- virtual box ubuntu 与Windows共享文件夹
由于懒得去截图了,直接抛链接.参考链接:http://www.cnblogs.com/lidabo/p/5317024.html 简介概括:首先安装增强功能,接着在virtual box的seting ...
- MySQL最常用日期时间函数
日期和时间函数 可能的需求: 当前时间是多少.下个月的今天是星期几.统计截止到当前日期前 3 天的收入总和-- 上述需求就需要使用日期和时间函数来实现: MySQL服务器中的三种时区设置: ①系统时区 ...
- c标签和foreach循环不能加载
需要同时导入2个包: jstl.jar和standard.jar(大多数时候只会注意到jstl包,而忽视了standard包) 代码: c标签的写法 <%@ taglib prefix=&quo ...
- Vue2.x中的父组件数据传递至子组件
父组件结构 template <template> <div> <v-girl-group :girls="aGirls"></v-gir ...