2012-05-03 35 views
5

Làm cách nào để phân tích cú pháp các chuỗi truefalse trong một mảng để trở thành boolean nếu chúng tồn tại?Cách phân tích chuỗi đúng và sai trong một mảng để trở thành boolean

Ví dụ,

dạng

$config = array(
    "allow_n" => "true", 
    "allow_m" => "false", 
    "say"  => "hello" 
); 

để

$config = array(
    "allow_n" => true, 
    "allow_m" => false, 
    "say"  => "hello" 
); 

Có thể?

EDIT:

Thanks guys cho sự giúp đỡ.

Xin lỗi tôi quên để làm rõ ngay từ đầu - trường hợp này có thể xảy ra trong một mảng multidimentinal, ví dụ,

$config = array(
    "allow_n" => "true", 
    "allow_m" => "false", 
    "say"  => "Hello", 
    "php" => array(
     "oop" => "true", 
     "classic" => "false" 
    ) 
); 
+0

là câu hỏi của bạn thực sự về siêu đơn giản so sánh chuỗi này, hoặc là nó về làm thế nào để đi bộ qua một mảng đa chiều? Nếu sau này, có thể bạn nên cân nhắc việc thay đổi tiêu đề câu hỏi của mình. – mbeckish

Trả lời

5

bạn có thể sử dụng array_walk_recursive để đạt được điều này:

Ví dụ

$config = array (
     "allow_n" => "true", 
     "allow_m" => "false", 
     "say" => "Hello", 
     "php" => array (
       "oop" => "true", 
       "classic" => "false" 
     ) 
); 
var_dump ($config); 

array_walk_recursive ($config, function (&$item) { 
    if ($item == "true") { 
     $item = true; 
    } else if ($item == "false") { 
     $item = false; 
    } else if (is_numeric ($item)) { 
     $item = intval ($item); 
    } 
}); 

var_dump ($config); 

Output Trước

'allow_n' => string 'true' (length=4) 
    'allow_m' => string 'false' (length=5) 
    'say' => string 'Hello' (length=5) 
    'php' => 
    array 
     'oop' => string 'true' (length=4) 
     'classic' => string 'false' (length=5) 

Output Sau

array 
    'allow_n' => boolean true 
    'allow_m' => boolean false 
    'say' => string 'Hello' (length=5) 
    'php' => 
    array 
     'oop' => boolean true 
     'classic' => boolean false 
+0

cảm ơn @Baba, vui lòng xem chỉnh sửa của tôi cho tình huống mảng đa chiều ... – laukok

+0

xem mã được cập nhật – Baba

4
foreach ($config as $k=>$v) 
{ 
    $low_v = strtolower($v); 
    if ($low_v == 'true') 
    $config[$k] = true; 
    else if ($low_v == 'false') 
    $config[$k] = false; 
} 
+1

Kết quả của 'strtolower ($ v)' không thay đổi, tại sao gọi nó là 2 lần – Esailija

+1

Tôi không nghĩ rằng sự xuống cấp hiệu suất mà cuộc gọi thứ hai sẽ giới thiệu sẽ có ý nghĩa đáng kể, trừ khi, tất nhiên, mảng '$ config' cực kỳ lớn. – Aziz

+1

Vấn đề không phải là hiệu suất, các vấn đề với lập trình sao chép dán phải nổi tiếng. Nếu tôi cần thêm '" null "' thì sao? Điều gì sẽ xảy ra nếu sau này tôi cần phải sửa đổi nó thành 'mb_strtolower' vv Nó dễ dàng hơn nhiều để duy trì khi bạn giảm thiểu các bộ phận chuyển động. – Esailija

2

Dưới đây là một vòng lặp đó sẽ làm điều đó

foreach ($config as $key => $val) { 
    if ($val == 'true') { 
     $config[$key] = true; 
    } elseif ($val == 'false') { 
     $config[$key] = false; 
    } 
} 

Sửa : Đây là một chức năng để đệ quy và xử lý các mảng đa chiều

function tfSwap($arr) { 
    foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      $arr[$key] = tfSwap($val); 
     } else { 
      if ($val == 'true') { 
       $arr[$key] = true; 
      } elseif ($val == 'false') { 
       $arr[$key] = false; 
      } 
     } 
    } 
    return $arr; 
} 
.210

Sau đó, bạn chỉ có thể gọi nó là như thế này:

$config = tfSwap($config); 
1

Tôi chắc chắn có các giải pháp khác, nhưng bạn sẽ có thể sử dụng chức năng filter_var và chuyển vào cờ FILTER_VALIDATE_BOOLEAN. Điều đó sẽ cung cấp cho bạn một lớp lót thay vì viết ra một vòng lặp. :)

filter_var($config, FILTER_VALIDATE_BOOLEAN); 

// chỉnh sửa: tương tự như đề xuất ở đây: How to parse a string of boolean logic in PHP

+0

Còn về "hello" thì sao? –

+0

@pst: Tốt, tôi hoàn toàn bỏ qua điều đó. Thật không may là không có cờ thích hợp cờ để giữ giá trị trong trường hợp nó không được nhận dạng như là một boolean (chỉ là cờ return-null-flag-if-no-boolean), vì vậy điều này thực sự sẽ không giúp OP. Cảm ơn vì đã chỉ cho tôi! –

+0

+1 cho hàm filter_var – Benjam

1

Bạn cũng có thể duy trì một mảng của các chuyển đổi, và tìm trong đó trong khi iterating trên mảng.

$map = array("true" => true, "false" => false); 
foreach ($config as $key => $value) { 
    if (array_key_exists($value, $map)) { 
     $config[$key] = $map[$value]; 
    } 
} 
0

cách tiếp cận của tôi sẽ như thế nào:

function boolify($var) { 
    if(is_array($var)) foreach($var as $ek=>$ev) $ret[$ek] = boolify($ev); 
    else if($var === 'false') $ret = false; 
    else if($var === 'true') $ret = true;   
    else $ret = $var; 
    return $ret; 
} 

$config = array(
    "allow_n" => "true", 
    "allow_m" => "false", 
    "say"  => "Hello", 
    "php" => array(
     "oop" => "true", 
     "classic" => "false" 
    ) 
); 

$config = boolify($config); 

var_dump($config); 

// output: array(4) { ["allow_n"]=> bool(true) ["allow_m"]=> bool(false) ["say"]=> string(5) "Hello" ["php"]=> array(2) { ["oop"]=> bool(true) ["classic"]=> bool(false) } } 
+1

nhờ @conrad để được trợ giúp. – laukok

Các vấn đề liên quan