求教一段程序该如何写

「已注销」 2012-08-13 03:36:04
id0 id1 id2 id3 id4
1 ko > 11 0
2 ko > 12 0
3 ko > 13 2
4 ko > 14 0
5 ko > 15 0
6 ko > 16 5
7 ko > 14 0

结果=》((ko>11 and ko>12) or ko>13 and ko>14 and ko>15 )or ko>16 and ko>17

如题,上面是一个数据库表 可以用数组表示,现在我想做的功能是
当id4=0的时候 我会从id0依次往下走 碰到0就用AND连接2个数据。碰到大于0的就表示要把这个数字前面的列用or连接,就像我上面贴出的结果。 请教这个程序该如何写
...全文
329 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Meteorlet 2012-08-16
  • 打赏
  • 举报
回复

<?php
$dat = array (
0 => array (
'eo_id' => 10,
'pt' => 'a',
'operation_id' => '>=',
'info' => 1,
'link' => 0,
),
1 => array (
'eo_id' => 11,
'pt' => 'b',
'operation_id' => '<',
'info' => 2,
'link' => 10,
),
2 => array (
'eo_id' => 12,
'pt' => 'c',
'operation_id' => '=',
'info' => 3,
'link' => 0,
),
3 => array (
'eo_id' => 13,
'pt' => 'd',
'operation_id' => '>',
'info' => 4,
'link' => 10,
),
4 => array (
'eo_id' => 15,
'pt' => 'e',
'operation_id' => '>=',
'info' => 5,
'link' => 0,
),
);

$result = '';
$first = 0;
foreach($dat as $v)
{
$exp = $v['pt'].$v['operation_id'].$v['info'];
if($v['link'] == 0) {
$result .= ($first++ == 0) ? $exp : " and " . $exp;
} else {
$result = "($result) or " . $exp;
}
}
print($result);
?>
「已注销」 2012-08-15
  • 打赏
  • 举报
回复
没办法,客户那边要这种方案。
link的值是连接eo_id的,并不是表示前面要连接起来的列的数量

我这样的需求是不是没法实现了?
xuzuning 2012-08-15
  • 打赏
  • 举报
回复
你不是放弃了这个方案吗?怎么还弄?
对于 $sign[$i-$v['link']] .= '('; 要求$v['link']的值是自$i起的向前偏移量。
你的显然不是

动态输入表达式要这样方式,处理起来就简单了
开弧 变量名 关系 值 与下一项的关系 闭弧
「已注销」 2012-08-15
  • 打赏
  • 举报
回复
唠叨兄,我按你提供的方法得到的数据有点出入,麻烦帮我看看

Array
(
[0] => Array
(
[eo_id] => 10
[pt] => 'a'
[operation_id] => >=
[info] => 1
[link] => 0
)

[1] => Array
(
[eo_id] => 11
[pt] => 'b'
[operation_id] => <
[info] => 2
[link] => 10
)

[2] => Array
(
[eo_id] => 12
[pt] => 'c'
[operation_id] => =
[info] => 3
[link] => 0
)

[3] => Array
(
[eo_id] => 13
[pt] => 'd'
[operation_id] => >
[info] => 4
[link] => 12
)

[4] => Array
(
[eo_id] => 15
[pt] => 'e'
[operation_id] => >=
[info] => 5
[link] => 0
)

)

应该要的结果为: (((a >=1) or b<2 and c=3) or d>4) and e>=5
实际结果为: a >=1) or b<2 and c=3) or d>4 and e>=5((


$sign = array_fill(0, count($tmp), '');

foreach($tmp as $i=>$v) {
$sign[$i+1] = ' and ';
if($v['link']) {
$sign[$i-$v['link']] .= '(';
$sign[$i] = ') or ';
}
}
array_pop($sign);
$s = '';//print_r($tmp);
foreach($sign as $i=>$v) $s .= $v . $tmp[$i]['pt'] .$tmp[$i]['operation_id'] . $tmp[$i]['info'] ;

「已注销」 2012-08-15
  • 打赏
  • 举报
回复
客户方被我弄死了1个。高枕无忧。啊哈哈哈!!!
蓝色的雨哎 2012-08-15
  • 打赏
  • 举报
回复
你就跟客户说这种方案是不可取的 没法做的。 真想这样做,就拿高价吓唬他,换一种方法能实现想要的就行。
「已注销」 2012-08-15
  • 打赏
  • 举报
回复

唠叨大哥谢谢了,我现在就过去砍了客户。稍后跟各位汇报情况
xuzuning 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

没办法,客户那边要这种方案。
[/Quote]虽然说用户是上帝
但上帝也是会犯错的

要是用户让你写程序得到 1 + 1 = 3,你也照着做吗?
xuzuning 2012-08-15
  • 打赏
  • 举报
回复
你哥的条件不充分
$dat = array (
0 => array (
'eo_id' => 10,
'pt' => 'a',
'operation_id' => '>=',
'info' => 1,
'link' => 0,
),
1 => array (
'eo_id' => 11,
'pt' => 'b',
'operation_id' => '<',
'info' => 2,
'link' => 10,
),
2 => array (
'eo_id' => 12,
'pt' => 'c',
'operation_id' => '=',
'info' => 3,
'link' => 0,
),
3 => array (
'eo_id' => 13,
'pt' => 'd',
'operation_id' => '>',
'info' => 4,
'link' => 10,
),
4 => array (
'eo_id' => 15,
'pt' => 'e',
'operation_id' => '>=',
'info' => 5,
'link' => 0,
),
);
$k = '';
foreach($dat as $item) {
$st[$item['eo_id']] = array('', $item['pt'].$item['operation_id'].$item['info']);
if($item['link']) {
$st[$item['link']][0] .= '(';
$st[$item['eo_id']][0] = ') or ';
}else {
$st[$item['eo_id']][0] = $k;
}
$k = ' and ';
}
$s = '';
foreach($st as $item) $s .= join('', $item);
echo $s;

((a>=1) or b<2 and c=3) or d>4 and e>=5
franzhong 2012-08-14
  • 打赏
  • 举报
回复
录入的话,应该是管理员录入的,应该不是乱输入的,一般不能出差错,也可权当成规则
若是随便输的,那就不行了,因为有and or问题,无规则,肯定是没办法
「已注销」 2012-08-14
  • 打赏
  • 举报
回复
我研究了半天终于放弃,我发现这样的数据取决于录入人员的输入问题,没个统一的规则,我很难把他们的各种条件匹配出来。唠叨兄的办法很好,感谢!
xuzuning 2012-08-13
  • 打赏
  • 举报
回复
嗯,是的
事情也没有那么简单,你的 id4 并不只是标志,他的值表示前多少项要用括号括起
$dat = array(
array('a=1', 0), //我在这里加了一项
array('ko>11', 0),
array('ko>12', 0),
array('ko>13', 2),
array('ko>14', 0),
array('ko>15', 0),
array('ko>16', 5),
array('ko>14', 0),
);
$sign = array_fill(0, count($dat), '');

foreach($dat as $i=>$v) {
$sign[$i+1] = ' and ';
if($v[1]) {
$sign[$i-$v[1]] .= '(';
$sign[$i] = ') or ';
}
}
array_pop($sign);
$s = '';
foreach($sign as $i=>$v) $s .= $v . $dat[$i][0];

echo $s;
a=1 and ((ko>11 and ko>12) or ko>13 and ko>14 and ko>15) or ko>16 and ko>14
「已注销」 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

PHP code
$dat = array(
array('ko>11', 0),
array('ko>12', 0),
array('ko>13', 2),
array('ko>14', 0),
array('ko>15', 0),
array('ko>16', 5),
array('ko>14', 0),
);
$stack = array();
$res = array()……
[/Quote]
唠叨兄。我运行出来在OR的后面多了一个AND 我改成echo join(' ', $stack);这样了。不知道是为什么
「已注销」 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

PHP code

$data = array(
array(
'id0'=>1,
'id1'=>'ok',
'id2'=>'>',
'id3'=>11,
'id4'=>0
),
array(
'id0'=>1,
'id1'=>'ok1',
'……
[/Quote]
朋友,我这边碰到or就是要扩上括号的,上述方法无法做到。单一匹配倒是没问题
cainiaophper 2012-08-13
  • 打赏
  • 举报
回复

$arr=array(
0=>array('ko','>',11,0),
1=>array('ko','>',12,0),
2=>array('ko','>',13,2),
3=>array('ko','>',14,0),
4=>array('ko','>',15,0),
5=>array('ko','>',16,5),
6=>array('ko','>',17,0),
);
$str='';
$l="(";
$r=")";
foreach($arr as $key=>$val){
if($key==0){
if($val[3]==0){
$str.=$val[0].$val[1].$val[2];
}else{
$str.=$val[0].$val[1].$val[2];
}
}else{
if($val[3]==0){
$str.=' and '.$val[0].$val[1].$val[2];
}else{
$str=$l.$str;
$str.=$r.' or '.$val[0].$val[1].$val[2];
}
}
}
echo $str;

((ko>11 and ko>12) or ko>13 and ko>14 and ko>15) or ko>16 and ko>17
cainiaophper 2012-08-13
  • 打赏
  • 举报
回复

$arr=array(
0=>array('ko','>',11,0),
1=>array('ko','>',12,0),
2=>array('ko','>',13,2),
3=>array('ko','>',14,0),
4=>array('ko','>',15,0),
5=>array('ko','>',16,5),
6=>array('ko','>',17,0),
);
$str='';
$l="(";
$r=")";
foreach($arr as $key=>$val){
if($key==0){
if($val[3]==0){
$str.=$val[0].$val[1].$val[2];
}else{
$str.=$val[0].$val[1].$val[2];
}
}else{
if($val[3]==0){
$str.=' and '.$val[0].$val[1].$val[2];
}else{
$str=$l.$str;
$str.=$r.' or '.$val[0].$val[1].$val[2];
}
}
}
echo $str;

((ko>11 and ko>12) or ko>13 and ko>14 and ko>15) or ko>16 and ko>17
xuzuning 2012-08-13
  • 打赏
  • 举报
回复
$dat = array(
array('ko>11', 0),
array('ko>12', 0),
array('ko>13', 2),
array('ko>14', 0),
array('ko>15', 0),
array('ko>16', 5),
array('ko>14', 0),
);
$stack = array();
$res = array();
foreach($dat as $v) {
if($v[1]) $stack = array( '(' . join(' and ', $stack) . ') or ');
$stack[] = $v[0];
}
echo join(' and ', $stack);
((ko>11 and ko>12) or and ko>13 and ko>14 and ko>15) or and ko>16 and ko>14
o_owangdong 2012-08-13
  • 打赏
  • 举报
回复

$data = array(
array(
'id0'=>1,
'id1'=>'ok',
'id2'=>'>',
'id3'=>11,
'id4'=>0
),
array(
'id0'=>1,
'id1'=>'ok1',
'id2'=>'>',
'id3'=>11,
'id4'=>0
),
array(
'id0'=>1,
'id1'=>'ok2',
'id2'=>'>',
'id3'=>8,
'id4'=>2
),
);

foreach($data as $key=>$val){
$str .= " {$val['id1']} {$val['id2']} {$val['id3']} ";
if($key + 1 >= count($data)){
break;
}
if($val['id4'] == 0){
$str .= "and";
}else{
$str .= "or";
}
}

这里小于0的情况都算作用or连接了
论网络安全的重要性全文共2页,当前为第1页。论网络安全的重要性全文共2页,当前为第1页。论网络安全的重要性 论网络安全的重要性全文共2页,当前为第1页。 论网络安全的重要性全文共2页,当前为第1页。 随着互联网络的发展和普及,人们的生活方式、学习以及工作也发生了很大的变化,人们生活中的点点滴滴都与网络有着密切的联系,互联网给我们提供了丰富的资源以便于我们共享,提高了灵活性和便捷性。 在科学技术高速发展的背景下,我国已经离不开互联网技术的支持,在社会的各个行业领域互联网技术的重要作用依然不容忽视,是促进国家和社会综合发展的重要推手。如今,互联网已经深入到社会的各个角落,网络成了人们工作与生活中不能缺少的,人们发现各种工作已经脱离传统的管理模式,进入到"网络信息化"办公时代,因此,计算机的故障、网络信息的安全性,甚至网络病毒对于企业来说已经是非常重要的大事,一旦网络系统出现了问题,这将是整个企业的大故障,有一些金融、物流、交通、经济等企业公司,网络系统如果发生故障的话,完全可以导致企业业务的中断,甚至导致企业的停业。因此,网络信息安全对一个企业公司来讲是非常重要的,需要高度重视。 由于互联网的不断发展,互联网在人们日常生活当中以及学习工作中应用率越来越高,从而使网络信息安全技术的发展前景非常可观,首先,随着市场需求的不断增加,网络安全维护类软件的销售量不断攀升。其次,维护网络安全的相关软件的开发也逐渐向多元化发展,最后,由于我国目前的网络信息安全技术虽然在进步但是仍处于发展的阶段,要想达到发展水平较高的很多国家的水准还有很长的路要走,我们要正式这一客观事实,这也告诉我们要虚心求教,尤其对于那些网络软件开发商而言,要善于从其他国家和地区学习先进的技术和手段,为我所用,从各个角度减少我国网络信息安全存在的安全隐患。 我们要做的不仅是防范于未然,提前做好防备工作,而且要重视该领域法律制度的建设,从法律层面为网络安全提供必要保障,二者形成合力,才能切实维护好维护信息安全。 完善法律法规,充分发挥法律法规的约束和规范作用,加大对网络犯罪的严惩力度。除此之外,提高行业专业人士的综合素质也不失为一种有效措施,针对网络安全问题在他们中间开展相应的培训,提高他们的职业道德,不屑于做出危害网络安全的行为。此外,还应该从青少年入手,对他们进行网络信息安全教育。 论网络安全的重要性全文共2页,当前为第2页。论网络安全的重要性全文共2页,当前为第2页。在网络信息高速发展的背景下,我国在网络信息安全维护技术方面也取得一定的成就,为互联网的信息安全提供了有效的屏障。网络安全事关重大,影响深远,直接影响到计算机系统数据和程序的安全。所以,网络安全的防御要面面俱到,综合考虑各方面的影响,只有这样才有可能有效预防网络安全问题的发生。 论网络安全的重要性全文共2页,当前为第2页。 论网络安全的重要性全文共2页,当前为第2页。 论网络安全的重要性

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧