2009-11-03 4 views
0

Я ищу хороший способ разобрать строку на две переменные с помощью PHP. Переменные называются minage и MaxAge, и они должны быть проанализированы в соответствии с примерами ниже:Строка parse, содержащая диапазон значений до минимальных и максимальных переменных

"40" -> minage=40, maxage=40 
"-40" -> minage=null, maxage=40 
"40-" -> minage=40, maxage=null 
"40-60" -> minage=40, maxage=60 

ответ

4

Попробуйте это:

$minrange = null; 
$maxrange = null; 
$parts = explode('-', $str); 
switch (count($parts)) { 
case 1: 
    $minrange = $maxrange = intval($parts[0]); 
    break; 
case 2: 
    $minrange = $parts[0] == "" ? null : intval($parts[0]); 
    $maxrange = $parts[1] == "" ? null : intval($parts[1]); 
    break; 
} 
0
$parts = explode("-", $str); 
$minage = NULL; 
$maxage = NULL; 
if (count($parts) == 1) { 
    $minage = intval($parts[0]); 
    $maxage = $minage; 
} 
else if ((count($parts) >= 2) && is_numeric($parts[0]) && is_numeric($parts[1])) { 
    $minage = intval($parts[0]); 
    $maxage = intval($parts[1]); 
} 
2

Вы также можете инкапсулировать данные в классе, скажем, Диапазон:

class Range { 

    protected $min; 
    protected $max; 

    public function __construct($str) { 
    if(preg_match('/^\d+$/', $str)) { 
     $this->min = (int)$str; 
     $this->max = (int)$str; 
    } else { 
     preg_match('/^(\d*)-(\d*)$/', $str, $matches); 
     $this->min = $matches[1] ? (int)$matches[1] : null; 
     $this->max = $matches[2] ? (int)$matches[2] : null; 
    } 
    } 

    // more functions here like contains($value) and/or min() and max() 

    public function __toString() { 
    return 'min=' . $this->min . ', max=' . $this->max; 
    } 
} 

$tests = array('40', '-40', '40-', '40-60'); 
foreach($tests as $t) { 
    echo new Range($t) . "\n"; 
} 

, который производит:

min=40, max=40 
min=, max=40 
min=40, max= 
min=40, max=60 

Конечно, вы можете заменить вызовы preg_ на некоторые «нормальные» строковые функции, но единственное, что я знаю о PHP, - это какое-то регулярное выражение.

+0

Это хорошая идея, но зачем делать переменные защищенными? Предположительно, вы хотите иметь доступ к данным, которые вы извлекли, в противном случае нет смысла ... –

+1

@Matthew, да, они могут быть преданы гласности или оставить их защищенными и предоставить дополнительные методы в классе Range (который я оставил вне). –

Смежные вопросы