2010-08-18 56 views
-1

哎这个疑难问题all.i'm新手在表中的结果这样的数据:组合正则表达式和PHP还是不行

item    range_code     class 
red    123x0001-123x0500    A 
blue    123x0021-123x0100    //if null read zero 
green    123x0001-123x0300    b 

我要像结果:

item    qty   S   A   B   C 
red    500   0   1   0   0 
blue   80   0   0   0   0 
green   300   0   0   1   0 

我已尝试此代码,但仍然不起作用:

$sql= 'SELECT item, range_code as qty, class FROM result GROUP BY item, qty'; 
$result=mysql_query($sql); 
while ($row=mysql_fetch_assoc($result)){ 
     preg_match_all('/\d+(?=-|$)/g',$row['qty'],$matches); 
     echo intval($matches[0][1])-intval($matches[0][0])+1; 
     } 

我仍然为这个问题混淆。 请帮忙..

+6

您将不得不解释您的预期输出值来自哪里。 – 2010-08-18 03:15:28

+0

即使我必须对评论+1。 – sberry 2010-08-18 03:31:49

回答

1

不知道这是否做你想要的...如果没有,澄清是否有任何边缘情况下不匹配,但基于你的例子这应该工作。

<?php 

$code = "123x0001-123x0500"; 
preg_match("/^\d+x(\d+)-\d+x(\d+)$/", $code, $matches); 
echo intval($matches[2]) - intval($matches[1]) + 1; 

?> 

OUTPUT:

500 

<?php 

$codes = array("123x0001-123x0500", "123x0021-123x0100", "123x0001-123x0300"); 

function getDiff($range) { 
    preg_match("/^\d+x(\d+)-\d+x(\d+)$/", $range, $matches); 
    return intval($matches[2]) - intval($matches[1]) + 1; 
} 

foreach ($codes as $code) { 
    echo getDiff($code) . "\n"; 
} 

?> 

OUTPUT

500 
80 
300 

不确定的S,A,B,C的值应该如何被计算。也许你可以详细说明一下。

+0

看起来A/B/C列只是表示'代码'数据库表内容的位域。如果代码= A,那么A = 1,B = 0,C = 0等......不知道S可能是什么,除了(显然来自给定样本)一个零字段 – 2010-08-18 03:36:22

+0

@Marc B:你可以看到在我的链接问题。 – klox 2010-08-18 04:51:30