2013-04-22 133 views
0

所以我尝试使用下面的函数问题与strpos,strlen的,和SUBSTR

function disectColumnName($columnName){ 
    echo "fieldname: " .$columnName. "<br>"; 
    $periodLengths = array("min","hr","dy","wk"); # Array of periodLength Options 
    $periodLength = $periodLengths[array_search($columnName, $periodLengths)]; # Find which periodLength is used in columnName and sa 
    $periodDuration = substr($columnName, 0, strpos($columnName,$periodLength)); 
    echo 'periodLength: '.$periodLength . "<br>"; 
    echo 'periodDuration: '.$periodDuration . "<br>"; 
    $movingAverages = array("e","s"); 
    $movingAverageLoc = $movingAverages[array_search($columnName, $movingAverages)]; 
    echo "movingAverageLoc: " .$movingAverageLoc . "<br>"; 
    $startOfString = strpos($columnName,$periodLength)+strlen($periodLength); 
    $stringLength = strpos($columnName,$movingAverageLoc)-(strpos($columnName,$periodLength)+strlen($periodLength)); 
    # strpos($columnName,$movingAverageLoc) returns blank, should return strpos when movingAverages = "S" 
    echo "StartOf: ". $startOfString . "<br>"; 
    echo "StrLen: ". $stringLength . "<br>"; 
    $movingAverage = substr($columnName,$startOfString,$stringLength); 
    echo 'movingAverage: '.$movingAverage; 
} 

disectColumnName是一个循环过程中,通过列标题的下面阵列来剖析我的列名 -

array(12) { [0]=> string(7) "14min3e" [1]=> string(7) "14min4e" [2]=> string(8) "14min41e" [3]=> string(7) "14min3s" [4]=> string(8) "14min41s" [5]=> string(8) "14min32s" [6]=> string(9) "14min321s" [7]=> string(9) "15min321s" [8]=> string(8) "15min41s" [9]=> string(9) "15min321e" [10]=> string(8) "15min41e" [11]=> string(8) "15min32e" } 

问题是以's'结尾的列标题没有生成正确的StringLengthmovingAverageLoc(它显示的是e而不是S)。但是,如果列名在'e'结束,它完美的作品,什么给?

这里是什么是当前正在输出:

fieldname: 14min3e 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: 1 
movingAverage: 3 

fieldname: 14min4e 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: 1 
movingAverage: 4 

fieldname: 14min41e 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: 2 
movingAverage: 41 

fieldname: 14min3s 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: -5 
movingAverage: 

fieldname: 14min41s 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: -5 
movingAverage: 

fieldname: 14min32s 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: -5 
movingAverage: 

fieldname: 14min321s 
periodLength: min 
periodDuration: 14 
movingAverageLoc: e 
StartOf: 5 
StrLen: -5 
movingAverage: 

fieldname: 15min321s 
periodLength: min 
periodDuration: 15 
movingAverageLoc: e 
StartOf: 5 
StrLen: -5 
movingAverage: 

fieldname: 15min41s 
periodLength: min 
periodDuration: 15 
movingAverageLoc: e 
StartOf: 5 
StrLen: -5 
movingAverage: 

fieldname: 15min321e 
periodLength: min 
periodDuration: 15 
movingAverageLoc: e 
StartOf: 5 
StrLen: 3 
movingAverage: 321 

fieldname: 15min41e 
periodLength: min 
periodDuration: 15 
movingAverageLoc: e 
StartOf: 5 
StrLen: 2 
movingAverage: 41 

fieldname: 15min32e 
periodLength: min 
periodDuration: 15 
movingAverageLoc: e 
StartOf: 5 
StrLen: 2 
movingAverage: 32 
+3

,如果你看了PHP的sscanf的,这可能是很多更加容易()函数 - http://www.php.net/manual/ en/function.sscanf.php - 这将允许你在一行代码中剖析你的刺痛 – 2013-04-22 20:55:12

+0

我假设'array_search($ columnName,$ movingAverages)'总是返回false(转换为0等),作为$ columnName'是_never_'e'或's',但总是在它前面加上一些东西,所以它将在'$ movingAverages'中找不到。 – Wrikken 2013-04-22 20:58:14

+0

哈,我几乎已经准备好推荐正则表达式了......但Mark Ba​​kers的建议是_spot on_ :) – Wrikken 2013-04-22 20:59:12

回答

1
list($periodDuration, $periodLength, $movingAverage, $movingAverageLoc) = 
    sscanf($columnName, '%d%[a-z]%d%[a-z]'); 
+0

这是非常完美的谢谢你!我刚刚读到了sscanf。多么奇妙的功能,我以前从来没有听说过。再次感谢。 – Eric 2013-04-23 02:37:54

1

在这一行:

$movingAverageLoc = $movingAverages[array_search($columnName, $movingAverages)]; 

这部分:

array_search($columnName, $movingAverages) 

正在搜索的阵列,阵列( “e”,“s”)作为列名,“1” 5min41e“为例。除非你的列名是“e”或“s”,否则它总是返回false。因此,对于你的所有数据。例如它本​​质上是这样做的:

$movingAverageLoc = $movingAverages[false]; 

这是一样的:

$movingAverageLoc = $movingAverages[0]; 

这就是为什么你总是给我“E”为$ movingAverageLoc。至少需要修复该行。

但是,做你想做的事情要容易得多(不那么容易混淆)。使用preg_split一:

$string = "1wk2dy5hr15min431e"; 
$res = preg_split('~([0-9]+)([a-z]+)~i', $string, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); 
print_r($res); 

结果:

Array 
(
    [0] => 1 
    [1] => wk 
    [2] => 2 
    [3] => dy 
    [4] => 5 
    [5] => hr 
    [6] => 15 
    [7] => min 
    [8] => 431 
    [9] => e 
)