2012-01-16 10 views
30

Tôi đang phân tích cú pháp một số văn bản và tính toán trọng số dựa trên một số quy tắc. Tất cả các nhân vật đều có cùng trọng số. Điều này sẽ làm cho các tuyên bố chuyển đổi thực sự dài, tôi có thể sử dụng phạm vi trong trường hợp tuyên bố.php chuyển đổi trường hợp tuyên bố để xử lý phạm vi

Tôi đã thấy một trong những câu trả lời ủng hộ mảng kết hợp.

$weights = array(
[a-z][A-Z] => 10, 
[0-9] => 100, 
['+','-','/','*'] => 250 
); 
//there are more rules which have been left out for the sake of clarity and brevity 
$total_weight = 0; 
foreach ($text as $character) 
{ 
    $total_weight += $weight[$character]; 
} 
echo $weight; 

Cách tốt nhất để đạt được điều gì đó như thế này? Có điều gì đó tương tự như câu lệnh trường hợp bash trong php không? Chắc chắn viết xuống từng ký tự riêng lẻ trong mảng kết hợp hoặc câu lệnh chuyển đổi không thể là giải pháp thanh lịch nhất hoặc là giải pháp thay thế duy nhất?

Trả lời

1
$str = 'This is a test 123 + 3'; 

$patterns = array (
    '/[a-zA-Z]/' => 10, 
    '/[0-9]/' => 100, 
    '/[\+\-\/\*]/' => 250 
); 

$weight_total = 0; 
foreach ($patterns as $pattern => $weight) 
{ 
    $weight_total += $weight * preg_match_all ($pattern, $str, $match);; 
} 

echo $weight_total; 

* UPDATE: với giá trị mặc định *

foreach ($patterns as $pattern => $weight) 
{ 
    $match_found = preg_match_all ($pattern, $str, $match); 
    if ($match_found) 
    { 
     $weight_total += $weight * $match_found; 
    } 
    else 
    { 
     $weight_total += 5; // weight by default 
    } 
} 
+0

Cách tiếp cận rất đẹp. – nikhil

+0

Làm cách nào để thêm trường hợp mặc định. Nói điều gì đó không được tìm thấy và tôi muốn gán cho nó một trọng lượng cố định. – nikhil

+0

Tìm thấy thứ gì đó không khớp với bất kỳ trường hợp nào. Ngay bây giờ nó không nhận được bất kỳ trọng lượng được giao nhưng tôi muốn có một giá trị mặc định khác 0. – nikhil

123

Vâng, bạn có thể có phạm vi trong câu lệnh switch như:

//just an example, though 
$t = "2000"; 
switch (true) { 
    case ($t < "1000"): 
    alert("t is less than 1000"); 
    break 
    case ($t < "1801"): 
    alert("t is less than 1801"); 
    break 
    default: 
    alert("t is greater than 1800") 
} 

//OR 
switch(true) { 
    case in_array($t, range(0,20)): //the range from range of 0-20 
     echo "1"; 
    break; 
    case in_array($t, range(21,40)): //range of 21-40 
     echo "2"; 
    break; 
} 
+0

Cảm ơn, điều này thực sự hữu ích. – nikhil

+1

omg genius typecast, hiển nhiên! cảm ơn –

+0

Rất tốt !. Nhưng không ai có thể chấp nhận điều này. 40 againts 1 phiếu bầu. Đặt cược bạn kiếm được một số bedge. – vladkras

1

Bạn có thể xác định phạm vi nhân vật sử dụng biểu thức chính quy. Điều này tiết kiệm từ viết một danh sách trường hợp chuyển đổi thực sự dài. Ví dụ,

function find_weight($ch, $arr) { 
    foreach ($arr as $pat => $weight) { 
     if (preg_match($pat, $ch)) { 
      return $weight; 
     } 
    } 
    return 0; 
} 

$weights = array(
'/[a-zA-Z]/' => 10, 
'/[0-9]/' => 100, 
'/[+\\-\\/*]/' => 250 
); 
//there are more rules which have been left out for the sake of clarity and brevity 
$total_weight = 0; 
$text = 'a1-'; 
foreach (str_split($text) as $character) 
{ 
    $total_weight += find_weight($character, $weights); 
} 
echo $total_weight; //360 
1

Tôi nghĩ rằng tôi sẽ làm điều đó một cách đơn giản.

switch($t = 100){ 
    case ($t > 99 && $t < 101): 
     doSomething(); 
     break; 
} 
+1

doSomething() sẽ được gọi là allways, bởi vì "switch ($ t = 100)" gán 100 đến $ t –