2013-04-22 2 views
0

Так что я пытаюсь анализировать свои имена столбцов с помощью следующей функцииПроблема с StrPos, STRLEN и зиЬзЬг

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' не создают правильный StringLength или movingAverageLoc (он показывает 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

Это может быть гораздо проще, если бы вы смотрели на sscanf PHP() функции - http://www.php.net/manual/ en/function.sscanf.php - что позволит вам анализировать ваше жало в одной строке кода –

+0

Я предполагаю, что 'array_search ($ columnName, $ movingAverages)' всегда возвращает false (отличает от 0 и т. д.), поскольку '$ columnName' является _never_ 'e' или 's', но всегда что-то предшествует ему, поэтому оно не будет найдено в '$ movingAverages'. – Wrikken

+0

Hah, я был почти готов предлагать регулярные выражения ... Но предложение Mark Bakers - _spot on_ :) – Wrikken

ответ

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

Это замечательно! Я только что прочитал sscanf. Какая фантастическая функция, я никогда не слышал об этом раньше. Еще раз спасибо. – Eric

1

В этой строке:

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

Эта часть:

array_search($columnName, $movingAverages) 

ищет массив, массив («e», «s») для имени столбца «1 5min41e ", например. Если ваше имя столбца «e» или «s», оно всегда будет возвращать false. Таким образом, для всех, например, данные, что это по существу делает это:

$movingAverageLoc = $movingAverages[false]; 

, который так же, как:

$movingAverageLoc = $movingAverages[0]; 

Вот почему вы всегда получаете «е» за $ 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 
) 
Смежные вопросы