2012-05-03 55 views
5

如何解析truefalse字符串數組如果存在成爲布爾?如何解析真假字符串數組,成爲布爾

例如,

形式

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

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

這可能嗎?

編輯:

謝謝你們的幫助。

對不起,我忘了從一開始就澄清 - 這種情況下,可以在multidimentinal陣列發生,例如,

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

是您的問題實際上這個超級簡單的字符串比較,或者是如何通過多維數組走路嗎?如果是後者,那麼也許你應該考慮改變你的問題的標題。 – mbeckish

回答

5

可以使用array_walk_recursive來實現這一目標:

$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); 

輸出之前

'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) 

輸出後

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

謝謝@Baba,請參閱我的編輯多維陣列的情況... – laukok

+0

看到更新的代碼 – 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

'strtolower($ v)'的結果不會改變,爲什麼調用它2次 – Esailija

+1

我不認爲第二次調用將會引入的性能下降將具有任何相當重要的意義,除非當然,陣列'$ config'非常龐大。 – Aziz

+1

問題不在於性能,複製粘貼編程的問題應該是衆所周知的。如果我需要添加'「null」'?如果在此之後我需要將其修改爲'mb_strtolower'等,那麼在將移動部件最小化時,維護起來要容易得多。 – Esailija

2

這裏有一個循環,將做到這一點

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

編輯:下面是遞歸和處理多維數組的函數

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; 
} 

然後,你可以稱它是這樣的:

$config = tfSwap($config); 
1

。我相信還有其他的解決方案,但你應該能夠使用filter_var功能,並通過在FILTER_VALIDATE_BOOLEAN標誌。這將給你一個單線,而不是寫出一個循環。 :)

filter_var($config, FILTER_VALIDATE_BOOLEAN); 

//編輯:同在這裏建議:How to parse a string of boolean logic in PHP

+0

那麼「你好」呢? – 2012-05-03 19:32:55

+0

@pst:好點,我完全忽略了那個。不幸的是,沒有標誌適當的標誌來保存值,以防它不被識別爲布爾值(只有返回空標誌 - 如果沒有布爾標誌),所以這實際上不會幫助OP。感謝您指出我! –

+0

+1爲filter_var功能 – Benjam

1

你也可以保持轉換的數組,並期待在那裏,而迭代陣列上。

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

我的辦法是這樣的:

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

感謝@conrad的幫助。 – laukok

相關問題