在PHP中基于逻辑表达式过滤数组

4

我正在尝试在PHP中实现一个过滤器函数。我的二维输入数组看起来像下面这样:

name(string)    age(integer)    reg_date(date)
----------------------------------------------
John            22              12/03/2015
Anne            23              14/04/2015
Marry           24              01/02/2015
Tim             55              13/03/2015

我需要的是一个过滤器,可以像下面这样将逻辑表达式应用于输入源(自己起草):
{name:'age' type:'integer', operator:'==', value:'23'} OR {name:'age' type:'integer', operator:'==', value:'24'} AND {name:'reg_date' type:'date', operator:'>', value:'12/03/2015', format:'d/m/Y'}

用语言表达:给我所有年龄为23或24岁且注册日期晚于2015年12月3日的条目。

对于每种数据类型(type),应该存在一个过滤器,能够处理特定于数据类型的操作(例如,日期过滤器应该使用格式字段以正确的格式解析日期)。应该很容易添加新的数据类型。

上述表达式的正确输出应为:

name(string)    age(integer)    reg_date(date)
----------------------------------------------
Anne            23              14/04/2015

我的问题是:我需要自己编写词法分析器来解析逻辑表达式(可能会非常复杂),并应用我自己编写的过滤器,还是已经存在所需的过滤器函数?我尝试将数组解析为XML结构并使用XPath,不幸的是,PHP使用的XPath 1.0不能处理日期格式。我看了一下PHP Filter类中的filter_var,但似乎无法在那里使用逻辑表达式。

3
你能否从数据库中完成这个任务?实际上,这似乎是数据库的工作。如果你需要在代码中完成它,我认为你必须自己编写代码。 - borracciaBlu
1
“XPath 1.0 用于 PHP 时无法处理日期格式”- 为什么不尝试使用 strtotime() 将其转换为时间戳?另外,我会像 @borracciaBlu 所说的那样去做。这是数据库的工作。 - Darren
你需要创建逻辑运算符,例如LIKE、IN、BETWEEN等。这些都是在SQL中使用的。你能否详细说明一下如何填充你的数组?否则,你将需要大量排序和循环来匹配你的条件。 - Twisty
问题在于大部分数据都存储在文档中(这不是我的错)。我认为将其写入数据库并在那里进行查询会增加很大的开销,特别是因为数据也可能会不断变化。strtotime()运算符不是一个选项,因为像03/12/15这样的日期格式总是被视为m/d/Y,但实际上也可以是d/m/Y。 - Christian Vorhemus
@ChristianVorhemus,你解决问题了吗?是不是没有编写自定义代码呢? - til
1个回答

0
尝试使用 array_walk() PHP 函数。

这实际上是迭代的一个好开始,但我认为最难的部分是基于逻辑运算符的过滤。我担心没有内置函数可以做到这一点。 - Christian Vorhemus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接