2012-05-03 6 views
5

Come analizzare la stringa true e false in una matrice per diventare booleana se esistono?Come analizzare la stringa vera e falsa in una matrice per diventare booleani

Per esempio,

forma

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

a

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

è possibile?

EDIT:

Grazie ragazzi per l'aiuto.

scusate ho dimenticato di chiarire fin dal principio - questo caso può accadere in un array multidimentinal, per esempio,

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

è la tua domanda in realtà su questo confronto super-semplice stringa, o è su come camminare attraverso un array multidimensionale? Se quest'ultimo, allora forse dovresti prendere in considerazione la possibilità di cambiare il titolo della tua domanda. – mbeckish

risposta

5

è possibile utilizzare array_walk_recursive per raggiungere questo obiettivo:

Esempio

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

uscita prima

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

uscita Dopo

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

grazie a @Baba, vedere la mia modifica per la situazione di array multidimensionale ... – laukok

+0

vedere il codice aggiornato – Baba

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

Il risultato di 'strtolower ($ v)' non cambia, perché chiamarlo 2 volte – Esailija

+1

Non penso che il degrado delle prestazioni che la seconda chiamata introdurrà sarebbe di alcun significato considerevole, a meno che, ovviamente, la matrice non '$ config' è estremamente grande. – Aziz

+1

Il problema non sono le prestazioni, i problemi con la programmazione di copia incolla dovrebbero essere ben noti. Cosa devo fare se devo aggiungere "" null "'? Cosa succede se dopo questo ho bisogno di modificarlo in 'mb_strtolower' ecc. È molto più facile da mantenere quando si minimizzano le parti in movimento. – Esailija

2

Ecco un ciclo che lo farebbe

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

Edit : Ecco una funzione per la ricorsione e la gestione di array multidimensionali

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

Poi si può solo chiamare in questo modo:

$config = tfSwap($config); 
1

'm sicuro che non ci sono altre soluzioni, ma si dovrebbe essere in grado di utilizzare la funzione filter_var e passare la bandiera FILTER_VALIDATE_BOOLEAN. Questo ti darà un one-liner invece di scrivere un ciclo. :)

filter_var($config, FILTER_VALIDATE_BOOLEAN); 

// Edit: come suggerito qui: How to parse a string of boolean logic in PHP

+0

Per quanto riguarda "ciao"? –

+0

@pst: buon punto, ho completamente trascurato quello. Sfortunatamente non c'è nessun flag appropriato per mantenere il valore nel caso in cui non sia riconosciuto come booleano (solo un flag return-null-flag-if-no-boolean), quindi questo non aiuterà l'OP. Grazie per avermelo fatto notare! –

+0

+1 per la funzione filter_var – Benjam

1

Si potrebbe anche mantenere un allineamento delle conversioni, e guarda in là, mentre l'iterazione di matrice.

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

il mio approccio sarebbe come:

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

grazie a @conrad per l'aiuto. – laukok

Problemi correlati