【问题标题】: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"
    )
);

【问题讨论】:

  • 你的问题真的是关于这个超简单的字符串比较,还是关于如何遍历多维数组?如果是后者,那么也许您应该考虑更改问题的标题。

标签: php arrays boolean


【解决方案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) } } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          相关资源
          最近更新 更多