gpt4 book ai didi

php - 平面树数组转换成MYSQL where子句,兄弟代表OR,后代代表AND

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:49 27 4
gpt4 key购买 nike

我有一个包含树数据的平面数组。树的长度可以是任意的,深度可以根据用户的需要而定。每个节点都有以下数据:

id: 1,
parent: 0,

id: 2,
parent: 1,
equation: 'user.id = 1'

id: 3,
parent: 2,
equation: 'user.id <> 2'

id: 4,
parent: 1,
equation: 'user.id = 4'

我需要设计的是一种算法,将此数组转换为包含类似于以下内容的 mysql 子句的字符串:

WHERE ( user.id = 1 AND user.id <> 2 ) OR user.id = 4

同样,我无法限制此查询中的逻辑可能变得多么复杂,我只需要允许任何可能性,因此我可能需要将数据转换为关联数组并递归处理它。

查询的每个部分都由一个界面生成,用户可以在该界面中为他们的数据库中的用户创建分段规则。因此,他们可能希望选择以下用户:

WHERE user.id = 3 AND user.id != 4 AND user.date_of_birth < 1234567 AND user.date_of_birth > 7654321 AND user.last_purchased_date > 1234567;

我需要使用此数据源生成:

id: 1,
parent: 0,

id: 2,
parent: 1,
equation: 'user.id = 3'

id: 3,
parent: 2,
equation: 'user.id != 4'

id: 4,
parent: 3,
equation: 'user.date_of_birth < 1234567'

id: 5,
parent: 4,
equation: 'user.date_of_birth > 7654321'

id: 5,
parent: 5,
equation: 'user.last_purchase_date > 1234567'

从数据源可以看出,子元素代表AND(后代节点加AND子句),兄弟元素代表OR。即他们有相同的 parent :

id: 1,
parent: 0,

id: 2,
parent: 1,
equation: 'users.id = 3'

id: 3,
parent: 1,
equation: 'users.id = 4'

这将导致 OR 语句

WHERE user.id = 3 OR user.id = 4

树/数据源可以有任意数量的节点,包含任意数量的方程式,我需要使用此数据结构构建查询字符串来表示 AND/OR 化合物。

我有点不知道从哪里开始算法。

最佳答案

这样做很有趣!

$test=[ ['id'=> 1,'parent'=> 0],
['id'=> 2, 'parent'=> 1, 'equation'=> 'users.id = 1'],
['id'=> 3, 'parent'=> 2, 'equation'=> 'users.id <> 2'],
['id'=> 4, 'parent'=> 1, 'equation'=> 'users.id = 4']
];
$in_where=[];

echo whereFromArray($test,$in_where);

function whereFromArray($array=[],&$in_where)
{
$return='';

foreach ($array as $key => $value) {

$result=search($array, 'parent', $value['id']);

if (count($result)) {//has children

$return.= 'OR ('. str_replace('OR ', 'AND ', whereFromArray($result,$in_where)) .') ';

}elseif(!in_array($value['id'], $in_where)){

$return.= 'OR '.$value['equation'].' ';
$in_where[]=$value['id'];
}
}

return ltrim(ltrim($return,'AND '),'OR ');

}

function search($array, $key, $value)
{
$results = array();

if (is_array($array)) {


foreach ($array as $subarray) {

if (isset($subarray[$key]) && $subarray[$key] === $value) {

$results[] = $subarray;

}

}

}

return $results;
}

关于php - 平面树数组转换成MYSQL where子句,兄弟代表OR,后代代表AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com