很多时候,程序都是直接写好逻辑运算,提供给用户的是一个值,然后后台去比较;但是有时会提供一种类似计算器一样的交互方式的时候,PHP只能读懂用户的输入来进行比较了~

最近的一个项目涉及到一个由用户自定义输入比较方法,后台取相应数据,自动比较,输出结果。比如:

用户输入:   time>9&&time<15

后台执行:  读懂输入,获取数据,进行比较,输出比较的结果

看了需求,完全就是模拟PHP比较运算与数据库操作啊,干吧~~

<?php
$datas = json_decode(file_get_contents(INDEXJSON),true);// Global Var
// print_r($da); $condition = 'size>102400&&dir%/var/www/html/wordpress/wp-admin';
print_r(compare($condition)); // getdata for compare
function compare($condition){
global $datas;
$result = array();
$keys = explode(',', INDEXFORMAT);
if (!strpos($condition, '&&')) {
$conditions = $condition;
}else{
$conditions = explode('&&', $condition);
}
for($k = 0 ; $k < count($datas['name']) ; $k++) {
$flag = true;
foreach ($conditions as $subCondition) {
if (!getCompare($k, $subCondition)) {
$flag = false;
break;
}
}
if ($flag) {
$result[] = $k;
} }
return $result;// return keys array in datas
} function getCompare($key, $condition){
global $datas;
if(!preg_match('/[<>=!%]+/', $condition, $operator)){ //$operator[0]
return false;
}
$value = explode($operator[0], $condition);//x>12 => 12($value)
switch ($operator[0]) {
case '>':
return ($datas[$value[0]][$key] > $value[1]);
break;
case '>=':
return ($datas[$value[0]][$key] >= $value[1]);
break;
case '<':
return ($datas[$value[0]][$key] < $value[1]);
break;
case '<=':
return ($datas[$value[0]][$key] <= $value[1]);
break;
case '==':
return ($datas[$value[0]][$key] == $value[1]);
break;
case '<>':
return ($datas[$value[0]][$key] <> $value[1]);
break;
case '!=':
return ($datas[$value[0]][$key] != $value[1]);
break;
case '%':
if(strpos($datas[$value[0]][$key], $value[1]) === false){
return false;
}else{
return true;
}
break;
default:
return false;
break;
}
}

注:$data数组格式为

---------- PHP Debugger ----------
Array
(
[name] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
)

[dir] => Array
(
[0] => F
[1] => E
[2] => D
[3] => C
[4] => B
[5] => A
)

[time] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)

)

PHP——自定义比较算法的更多相关文章

  1. Wince/VC高效PNG贴图,自定义Alpha算法

    工作中,做一些炫点的界面都需要用到PNG图片,Wince里面微软也提供了PNG图片的支持,不过Alpha的混合速度比较慢,所以自己实现了一个Alpha的混合运算接口,经过测试,要比微软AlphaBle ...

  2. 基于Elasticsearch的自定义评分算法扩展

    实现思路: 重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索.   实现步骤: 1.新建java项目TestProject,引入Elast ...

  3. GuavaCache学习笔记一:自定义LRU算法的缓存实现

    前言 今天在看GuavaCache缓存相关的源码,这里想到先自己手动实现一个LRU算法.于是乎便想到LinkedHashMap和LinkedList+HashMap, 这里仅仅是作为简单的复习一下. ...

  4. sort 排序 自定义排序算法的使用

    // struct sort_by_pt// {// bool operator()(const std::pair<CString, AcGePoint3d> a, const std: ...

  5. 自定义简单算法MVC框架

    什么是MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,   它是一种软件设计典范,用一种业务逻辑.数据 ...

  6. PIE SDK算法的自定义扩展

    1.算法功能简介 算法的自定义扩展允许用户自主开发新的算法.自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来. 2.算法功能实 ...

  7. springcloud ribbon Finchley 版本,自定义算法

    引用上一个项目,在原有的基础上进行更改,添加springcloud的内荣. eureka-server 和上一个springcloud eureka的一样,没有改动. 添加cloud-api pack ...

  8. Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...

  9. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

随机推荐

  1. 085 HBase的二级索引,以及phoenix的安装(需再做一次)

    一:问题由来 1.举例 有A列与B列,分别是年龄与姓名. 如果想通过年龄查询姓名. 正常的检索是通过rowkey进行检索. 根据年龄查询rowkey,然后根据rowkey进行查找姓名. 这样的效率不高 ...

  2. (转)Java按指定行数读取文件

    package test import java.io.File; import java.io.FileReader; import java.io.IOException; import java ...

  3. 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)

    <题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...

  4. Cube Stack

    Cube Stack 有一点lazy思想,设三个数组cnt代表它以下的有多少个元素(直到栈底),top[x]代表x所在栈的栈顶元素,dad[x]代表x所在栈的栈底元素,先寻找父亲,然后递归更新累加cn ...

  5. Pytorch 基础

    Pytorch 1.0.0 学习笔记: Pytorch 的学习可以参考:Welcome to PyTorch Tutorials Pytorch 是什么? 快速上手 Pytorch! Tensors( ...

  6. Golang vs PHP 之文件服务器

    前面的话 作者为golang脑残粉,本篇内容可能会引起phper不适,请慎读! 前两天有同事遇到一个问题,需要一个能支持上传.下载功能的HTTP服务器做一个数据中心.我刚好弄过,于是答应帮他搭一个. ...

  7. js数据结构之集合的详细实现方法

    数据结构中的集合,类似于数学中常说的集合,是一类数据的群组.集合与集合之间还存在交集,并集,补集的运算. ***集合为无序,集合内元素不重复 ***js的set基于数组, 使用SetClass为类名, ...

  8. BeagleBone Black的内核移植-从零开始制作镜像

    很多年前做的针对BeagleBone Black开发板的镜像制作,因为当时涉及到非标准化的,所以把基本的kernel.uboot和跟文件系统rootfs都做了一遍,文中只做移植,不作定制化的修改. 如 ...

  9. mysql中的用法 count group by having

    1 语法: group by 字段 having 条件判断; group by的用法我已经在上一篇经验中介绍了 2 还是已员工绩效表为例   3 我们如果就是查询每个部门成绩大于89的员工数,可以这样 ...

  10. Outlook错误代码

    一般错误1 0x80004005 MISC The operation failed Virus Scanner Integration Issue Usually Related To Script ...