如何将数组中的真假字符串解析为布尔值

Posted

技术标签:

【中文标题】如何将数组中的真假字符串解析为布尔值【英文标题】:How to parse true and false string in an array to become booleans 【发布时间】:2012-05-13 08:33:24 【问题描述】:

如何将数组中的truefalse 字符串解析为布尔值(如果它们存在)?

例如,

表格

$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数据源存储布尔值?

Python中的字符串如何格式化布尔值?

如何在 Postgres 中将布尔数组转换为单个布尔值或单个字符串

如何在 JavaScript 中将字符串转换为布尔值?

将布尔数组中的所有值设置为 true