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连接,就像我上面贴出的结果。 请教这个程序该如何写 

解决方案 »

  1.   


    $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.   

    $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
      

  3.   


    $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
      

  4.   


    $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
      

  5.   

    唠叨兄。我运行出来在OR的后面多了一个AND  我改成echo join(' ', $stack);这样了。不知道是为什么
      

  6.   

    本帖最后由 xuzuning 于 2012-08-13 17:48:44 编辑
      

  7.   

    录入的话,应该是管理员录入的,应该不是乱输入的,一般不能出差错,也可权当成规则
    若是随便输的,那就不行了,因为有and or问题,无规则,肯定是没办法
      

  8.   

    唠叨兄,我按你提供的方法得到的数据有点出入,麻烦帮我看看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']  ;
      

  9.   

    你不是放弃了这个方案吗?怎么还弄?
    对于 $sign[$i-$v['link']] .= '('; 要求$v['link']的值是自$i起的向前偏移量。
    你的显然不是动态输入表达式要这样方式,处理起来就简单了
    开弧 变量名 关系 值 与下一项的关系 闭弧
      

  10.   

    没办法,客户那边要这种方案。
    link的值是连接eo_id的,并不是表示前面要连接起来的列的数量我这样的需求是不是没法实现了?
      

  11.   

    你哥的条件不充分$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
      

  12.   


    <?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);
    ?>