如何将数组中的真假字符串解析为布尔值
Posted
技术标签:
【中文标题】如何将数组中的真假字符串解析为布尔值【英文标题】:How to parse true and false string in an array to become booleans 【发布时间】:2012-05-13 08:33:24 【问题描述】:如何将数组中的true
和false
字符串解析为布尔值(如果它们存在)?
例如,
表格
$config = array(
"allow_n" => "true",
"allow_m" => "false",
"say" => "hello"
);
到
$config = array(
"allow_n" => true,
"allow_m" => false,
"say" => "hello"
);
有可能吗?
编辑:
感谢大家的帮助。
对不起,我忘了从一开始就澄清 - 例如,这种情况可能发生在多维数组中,
$config = array(
"allow_n" => "true",
"allow_m" => "false",
"say" => "Hello",
"php" => array(
"oop" => "true",
"classic" => "false"
)
);
【问题讨论】:
你的问题真的是关于这个超简单的字符串比较,还是关于如何遍历多维数组?如果是后者,那么也许您应该考虑更改问题的标题。 【参考方案1】:您可以使用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
【讨论】:
【参考方案2】:foreach ($config as $k=>$v)
$low_v = strtolower($v);
if ($low_v == 'true')
$config[$k] = true;
else if ($low_v == 'false')
$config[$k] = false;
【讨论】:
strtolower($v)
的结果没有变化,为什么要调用2次
我认为第二次调用所带来的性能下降不会有任何重大意义,当然,除非数组 $config
非常庞大。
问题不是性能,复制粘贴编程的问题应该是众所周知的。如果我需要添加 "null"
怎么办?如果在此之后我需要将其修改为 mb_strtolower
等。当您最小化移动部件时,维护起来会容易得多。
@Esailija 在后续评论中有更好的论据;-)
@Aziz 感谢您的回答,但多维数组会破坏您的代码......请参阅我上面的编辑。谢谢。【参考方案3】:
我确定还有其他解决方案,但您应该能够使用filter_var
函数并传入FILTER_VALIDATE_BOOLEAN
标志。这会给你一个单行而不是写一个循环。 :)
filter_var($config, FILTER_VALIDATE_BOOLEAN);
// 编辑:与此处建议的相同:How to parse a string of boolean logic in PHP
【讨论】:
@pst:好点,我完全忽略了那个。不幸的是,没有适当的标志来保留该值,以防它不被识别为布尔值(只有一个 return-null-flag-if-no-boolean 标志),所以这确实对 OP 没有帮助。感谢您向我指出!【参考方案4】:您还可以维护一个转换数组,并在遍历数组时查看那里。
$map = array("true" => true, "false" => false);
foreach ($config as $key => $value)
if (array_key_exists($value, $map))
$config[$key] = $map[$value];
【讨论】:
【参考方案5】:这是一个可以做到这一点的循环
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);
【讨论】:
【参考方案6】:我的方法是:
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)
【讨论】:
以上是关于如何将数组中的真假字符串解析为布尔值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用javascript将字符串数组转换为布尔值? [复制]
如何在Google表格中为Google Data Studio数据源存储布尔值?