如何解析数组中的“true”和“false”字符串并转换为布尔型?

5

如何将数组中的truefalse字符串解析为布尔类型?

例如:

form

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

to

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

你的问题真的只是关于这个超级简单的字符串比较,还是关于如何遍历多维数组?如果是后者,也许你应该考虑更改你的问题标题。 - mbeckish
6个回答

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

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) 的结果不会改变,为什么要调用它两次? - Esailija
1
我认为第二个调用会导致的性能下降并不会有任何显著的影响,除非当然,数组$config非常巨大。 - Aziz
1
问题不在于性能,而是复制粘贴编程的问题应该是众所周知的。如果我需要添加“null”怎么办?如果之后我需要将其修改为mb_strtolower等等。当你最小化移动部件时,维护起来就更容易。 - Esailija
@Esailija 后续评论中的论点更好;-) - user166390
@Aziz,感谢您的回答,但是多维数组会破坏您的代码……请参见我上面的编辑。谢谢。 - Run

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

//编辑:与此处建议相同:如何解析PHP中的布尔逻辑字符串

1
@pst:好观点,我完全忽略了这一点。不幸的是,没有适当的标志来保留该值,以防它未被识别为布尔值(只有一个在没有布尔值时返回null标志),因此这确实对OP没有帮助。感谢您指出这一点! - MH.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接