文档章节

除了switch,PHP就不能像Python一样使用Map来代替多分枝条件语句吗? (只讨论技术)

NILYANG
 NILYANG
发布于 2016/07/08 13:37
字数 1163
阅读 62
收藏 2

不可否认,语言之争经常是活跃网络气氛的一把好手!今天看到一个,感觉有点意思,同时也引发了我的进一步思考。 有同学说Python么有Switch语法,Python这点不爽云云,又有同学说Python有MAP,根本就用不着switch,而PHP就不能用MAP,顺便举了一个PHP的例子。前者虽然说得对,但拿不出坑点证据,容易挑起互喷,后者反击也是不错,并且提供了一段Python和PHP对比的代码。先不论语言好坏,就技术讨论而言,我更喜欢后者,赞一个。但是,不得不指出的是,后者的PHP例子并不能支撑其论点。 所以,就后者,我给出了一个PHP的例子:

<?php
//...
$add = function(int $a, int $b){return $a+$b;};
$sub= function(int $a, int $b){return $a -$b;};
$mul = function(int $a, int $b){return $a *$b;};
$div = function(int $a, int $b){return $a / $b;};
$operations = ['+'=>$add, '-'=>$sub, '*'=>$mul,'/'=>$div];
$a=1;
$b=2;

$operator = '+';
echo $operations[$operator]($a, $b),PHP_EOL;
$operator = '-';
echo $operations[$operator]($a, $b),PHP_EOL;
$operator = '*';
echo $operations[$operator]($a, $b),PHP_EOL;
$operator = '/';
echo $operations[$operator]($a, $b),PHP_EOL;

代码写到这里,我想很明了了,PHP最常用的数据类型不是别的,就是这个万能数组。

PHP不但支持多分支语句非if/switch方式实现,而且这种用法是处理大量分支判定的利器!

可能很多PHP新手,甚至老手都习惯于 if / switch 这种语句,高级一点的,可能会用到设计模式多态什么的。但是作为一个高级PHP,必须要优先考虑这种MAP的方式,不是出于对标Python,而是出于实实在在的性能提升,以及极大代码扩展性。相信熟悉开闭原则的你,肯定不希望当新的需求过来时,用一堆if/else 或者switch case去扩展本来封闭的好好的代码,那种代码真的很low。 当然,也不是所有if/switch可以用的地方都要用map来处理,map主要用在扩展性极强,性能要求考虑上(比如,几十个可能性)等。 其实,除了这个,平时我们在做if判定的时候,还可以两者结合,性能更佳哟:

举个例子: PHP常用到数组搜索判定 我们遇到这样一个需求,从一组人的信息中,找出名字编号为31的用户信息。

<?php
//搜索
$id = 31;
//数据
$person = [ ['name'=>'zhang san','age'=>23,'no'=>31], ['name'=>'zhang san','age'=>23,'no'=>21], /*...*/ ];
//查找
$find=[];
foreach($person as $info)
{
    if($info['no'] == $id){
        $find = $info;
        break;
    }
}

发现什么问题了吗?复杂度几何?能不能把复杂度降到O(1)仔细看几遍,然后再往下看。

对的,眼尖的你肯定看出来了,这个算法的复杂度最坏O(N)是不是?如果是成千上万个数据信息呢?想想都觉得疼哈~

所以是时释放大招了,针对这种情况,一般处理就是,先优化数据结构,然后,看看我们的算法,怎样降到O(1)

当然,就原来的数据作为初始数据的话,肯定没办法优化了,我们为了优化,得这样干一遍先

//data.php 空间换时间,先处理数据

<?php
//...
$person_new = [];
foreach($person as $v)
{
    $person_new[$v['no']] = $v;    
}
unset($person);
save_json_data('data.json',$person);//存到data.json中

// search.php 使用处理后的数据

<?php
//...
$id = 31;
$person = get_json_data('data.json');
//查找
$find=[];
if(isset($person[$id])){  //亮点在这里,复杂度瞬间将为O(1) 有木有?
    $find = $person[$id];
}

好了,刚刚的例子已经举完,差不多可以收工了~其实放到Python/Java/C++或者任意其他语言中,肯定都有相应的性能优化办法,这里只是举了PHP中比较实用而且常常被各种PHPer忽略的关于数组的搜索和判定的正确用法。

最后呐,中午闲得慌,写了个C++的例子,发散发散(PS:静态语言这种表达就繁琐了一点):

#include<iostream>
#include<map>
#include<functional>
int main()
{
    std::map<std::string, std::function<double(float, float)>> opeations;
    opeations["+"] = [](const float &a, const float &b) {return  (a + b); };
    opeations["-"] = [](const float &a, const float &b) {return  (a - b); };
    opeations["*"] = [](const float &a, const float &b) {return  (a * b); };
    opeations["/"] = [](const float &a, const float &b) {return  (a / b); };

    float a = 1, b = 2;
    std::cout << opeations["+"](a, b) << "\n";
    std::cout << opeations["-"](a, b) << "\n";
    std::cout << opeations["*"](a, b) << "\n";
    std::cout << opeations["/"](a, b) << "\n";

    return 0;
}

© 著作权归作者所有

共有 人打赏支持
NILYANG
粉丝 14
博文 100
码字总数 19038
作品 0
杭州
高级程序员
私信 提问
Python 2 与 Python 3 的差异对比

这篇文章总结了一些与Python2.6相比Python3.0中的新特性.Python3是一个不向后兼容的版本,有了很多的改变,这些对于Python开发者来说是非常重要的,虽然多数人说Python3真正流行起来还需要一...

大数据之路
2013/11/02
0
1
编程规范之 if 语句的简单规则

很多读者都知道我对与类似 Python 和 Javascript 这样的语言的偏爱。其中一个原因就是它们的可阅读性高(好吧,除了 brainfuck 和 whitespace ,很多语言也有这个优点)。当我们编写了一些代...

凡程子
2013/01/08
3.6K
3
写给Python程序员的Scala入门教程

随着业务和数据的需要,我们引入了。对的支持还是挺好的,但毕竟它还是使用开发的,且现有的API并没有100%覆盖Python。所以就有了这篇文章,让Python程序员可以接触这门更高(级)、更快(速...

羊八井
2015/11/29
906
2
Python编程入门基础语法详解经典

一、基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型。内置的变量类型有如下几种: #浮点 float_number = 2.3 #复数 complex_number = 1 + 5j #整型 integer_nu...

qq1622479435
2018/08/19
0
0
Python编程入门基础语法详解(经典)

一、基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型。内置的变量类型有如下几种: #浮点 float_number = 2.3 #复数 complex_number = 1 + 5j #整型 integer_nu...

糖宝lsh
2018/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
1
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
4
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部