5

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

6 に答える 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
于 2012-05-03T19:24:30.640 に答える
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; 
}
于 2012-05-03T19:21:28.810 に答える
2

変換の配列を維持し、配列を反復処理しながらそこを調べることもできます。

$map = array("true" => true, "false"  => false);
foreach ($config as $key => $value) {
    if (array_key_exists($value, $map)) {
        $config[$key] = $map[$value];
    }
}
于 2012-05-03T19:34:22.920 に答える
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);
于 2012-05-03T19:21:30.893 に答える
2

filter_var他の解決策があると確信していますが、関数を使用してFILTER_VALIDATE_BOOLEANフラグを渡すことができるはずです。これにより、ループを書き出す代わりにワンライナーが得られます。:)

filter_var($config, FILTER_VALIDATE_BOOLEAN);

// 編集: ここで提案されているのと同じ: How to parse a string of boolean logic in PHP

于 2012-05-03T19:24:48.730 に答える
1

私のアプローチは次のようになります:

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) } } 
于 2012-05-03T20:38:00.473 に答える