2012-05-03 52 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

相关问题