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

Php 如何将数组中的真字符串和假字符串解析为布尔值,php,arrays,boolean,Php,Arrays,Boolean,如何将数组中的true和false字符串解析为布尔值(如果存在) 比如说, 形式 到 可能吗 编辑: 谢谢你们的帮助 抱歉,我忘了从一开始就澄清-例如,这种情况可能发生在多维数组中 $config = array( "allow_n" => "true", "allow_m" => "false", "say" => "Hello", "php" => array( "oop" => "true",

如何将数组中的
true
false
字符串解析为布尔值(如果存在)

比如说,

形式

可能吗

编辑:

谢谢你们的帮助

抱歉,我忘了从一开始就澄清-例如,这种情况可能发生在多维数组中

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

这里有一个循环可以做到这一点

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

您可以使用
array\u walk\u 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
我确信还有其他解决方案,但您应该能够使用该函数并传入
过滤器\u验证\u布尔值
标志。这将为您提供一行程序,而不是编写循环。:)


//编辑:和这里建议的相同:

您还可以维护一个转换数组,并在迭代该数组时查看该数组

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

我的做法是:

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

strtolower($v)
的结果没有改变,为什么要调用它两次呢?我认为第二次调用将导致的性能下降不会有太大的意义,当然,除非数组
$config
非常庞大。问题不在于性能,复制粘贴编程的问题应该是众所周知的。如果我需要添加
“null”
,该怎么办?如果在此之后,我需要将其修改为
mb\u strtolower
等。当您最小化移动部件时,它更易于维护。@Esailija后续注释中的参数要好得多;-)@Aziz感谢您的回答,但多维数组将破坏您的代码。。。请看我的编辑上面。谢谢。你的问题真的是关于这个超级简单的字符串比较,还是关于如何遍历多维数组?如果是后者,那么也许你应该考虑改变你的题目。@ PST:好点,我完全忽略了那个。不幸的是,没有合适的标志来保存该值,以防它不被识别为布尔值(如果没有布尔标志,则仅返回null标志),因此这确实无助于OP。感谢您向我指出!
    array
  'allow_n' => boolean true
  'allow_m' => boolean false
  'say' => string 'Hello' (length=5)
  'php' => 
    array
      'oop' => boolean true
      'classic' => boolean false
filter_var($config, FILTER_VALIDATE_BOOLEAN);
$map = array("true" => true, "false"  => false);
foreach ($config as $key => $value) {
    if (array_key_exists($value, $map)) {
        $config[$key] = $map[$value];
    }
}
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) } }