Frage Wie wahr und falsch Zeichenfolge in einem Array zu boolean zu analysieren


Wie analysiere ich das? true und false String in einem Array, um boolean zu werden, wenn sie existieren?

Zum Beispiel,

bilden

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

zu

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

Ist es möglich?

BEARBEITEN:

Danke Jungs für die Hilfe.

Tut mir leid, ich habe vergessen, von Anfang an zu klären - dieser Fall kann in einem multidimensionalen Array passieren, zum Beispiel

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

5
2018-05-03 19:18


Ursprung


Antworten:


Sie können verwenden array_walk_recursive um das zu erreichen :

Beispiel

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

Ausgabe vor

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

Ausgabe nach

    array
  'allow_n' => boolean true
  'allow_m' => boolean false
  'say' => string 'Hello' (length=5)
  'php' => 
    array
      'oop' => boolean true
      'classic' => boolean false

5
2018-05-03 19:24



foreach ($config as $k=>$v)
{
  $low_v = strtolower($v);
  if ($low_v == 'true')
    $config[$k] = true;
  else if ($low_v == 'false')
    $config[$k] = false; 
}

4
2018-05-03 19:21



Hier ist eine Schleife, die es tun würde

foreach ($config as $key => $val) {
    if ($val == 'true') {
        $config[$key] = true;
    } elseif ($val == 'false') {
        $config[$key] = false;
    }
}

Bearbeiten: Hier ist eine Funktion für Rekursion und Umgang mit mehrdimensionalen Arrays

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

Dann könnte man es einfach so nennen:

$config = tfSwap($config);

2
2018-05-03 19:21



Ich bin sicher, es gibt andere Lösungen, aber Sie sollten in der Lage sein, die filter_var Funktion und übergeben in der FILTER_VALIDATE_BOOLEAN Flagge. Das gibt Ihnen einen Einzeiler, anstatt eine Schleife zu schreiben. :)

filter_var($config, FILTER_VALIDATE_BOOLEAN);

// edit: wie hier vorgeschlagen: Wie man eine Kette von boolescher Logik in PHP analysiert


1
2018-05-03 19:24



Sie könnten auch ein Array der Konvertierungen verwalten und bei der Iteration über das Array nachsehen.

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

1
2018-05-03 19:34



Mein Ansatz wäre wie:

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

0
2018-05-03 20:38