boolean false word omgezet naar boolean true

Status
Niet open voor verdere reacties.

Dylanh

Gebruiker
Lid geworden
19 feb 2013
Berichten
124
Ik ben bezig met een zelf gemaakte functie, alleen ik heb nou een vreemd probleem.
PHP:
<?php

/* Gebruik:
	if(mif(waardes, expressie))

	het is automatisch een string, behalve:
	true of false => boolean (let op: 0 en 1 zou die herkennen als een int!!!)
	null => null
	3 => int
	3.5 => float

	al het andere is een string dus je hoeft geen quotes te gebruiken:
	if(mif('lennard', '===lennard')) => true
	if(mif('lennard', '==="lennard"')) => false

	nog een laaste voorbeeld:

	if(mif('lennard', 15, 'abc', 'jelleh', '!== false')) betekend dus:

	is lennard, 15, abc, jelleh niet gelijk aan false?

*/
function mif() {
	$arguments = func_get_args();
	$operators = array("===", "==", "!==", "<>", "!=", "<=", "<", ">=", ">");
	$expressie = NULL;

	foreach ($operators as $op) { /* Zoek de expressie */
		$i = 0;
		foreach ($arguments as $arg) {
			if(substr($arg, 0, strlen($op)) == $op && $expressie === NULL) {
				$expressie = array();
				$expressie[0] = substr($arg, 0, strlen($op));
				$expressie[1] = trim(substr($arg, strlen($op)));

				/* 	
					De waarde (expressie[1]) omzetten naar de correcte data type 
					Boolean, integer, float, null of anders is het een string
				*/
				switch (trim($expressie[1])) {
					case "false":
					case "FALSE":
					case "TRUE":
					case "true":
						settype($expressie[1], "boolean");
						break;
					case "null":
					case "NULL":
						settype($expressie[1], "null");
						break;
					default:
						if(is_numeric(trim($expressie[1])) && strpos(trim($expressie[1]), ".") === FALSE) {
							settype($expressie[1], "integer");
						} elseif(is_numeric(trim($expressie[1])) && strpos(trim($expressie[1]), ".") !== FALSE) {
							settype($expressie[1], "float");
						} else {
							settype($expressie[1], "string"); /* Het is al een string, maar just to be sure */
						}
						break;
				}
				
				unset($arguments[$i]);
			}
			$i++;
		}
	}

	for($i = 0; $i < count($arguments); $i++) {
		if(gettype($arguments[$i]) == "string"){
			switch (trim($arguments[$i])) {
				case "false":
				case "FALSE":
				case "TRUE":
				case "true":
					settype($arguments[$i], "boolean");
					break;
				case "null":
				case "NULL":
					settype($arguments[$i], "null");
					break;
				default:
					if(is_numeric(trim($arguments[$i])) && strpos(trim($arguments[$i]), ".") === FALSE) {
						settype($arguments[$i], "integer");
					} elseif(is_numeric(trim($arguments[$i])) && strpos(trim($arguments[$i]), ".") !== FALSE) {
						settype($arguments[$i], "float");
					} else {
						settype($arguments[$i], "string"); /* Het is al een string, maar just to be sure */
					}
					break;
			}
		}
	}

	var_dump($expressie);

	foreach ($arguments as $arg) {
		switch ($expressie[0]) {
			case "==":
				if(!$arg == $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case "===":
				if($arg === $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case "!=":
				if($arg != $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case "<>":
				if($arg <> $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case "!==":
				if($arg !== $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case "<":
				if($arg < $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case "<=":
				if($arg <= $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case ">=":
				if($arg >= $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			case ">":
				if($arg > $expressie[1]) {
					$output = TRUE;
				} else {
					return FALSE;
				}
				break;
			default:
				return FALSE;
				break;
		}
	}

	return TRUE;
}

$a = 3.5;
$b = 3.5;
$c = 3.5;

/* Is $a, $b en $c gelijk aan 3.5? */
if(mif('test', '=== false')) {
	echo "JA";
} else {
	echo "nee";
}
?>

Op regel 175, het laaste argument, === false zit het probleem want als ik een var dump doe; regel 94 komt daar dit uit:
array(2) { [0]=> string(3) "===" [1]=> bool(true) }

Zoals je ziet is het een boolean, wat goed is alleen is de waarde true. Ik heb geen idee waar dit aan ligt?

Hopelijk hebben jullie enige idee?
 
Ik doe een goekje

Je doet een "foreach $ARG" wat uiteindelijk een if "===" = "===" oplevert.

Als je de CASE doet op "strtoupper(trim($arg))" dan kun je matchen op alleen FALSE en TRUE, ook al is de input True, true, TRUE, TrUe, etc.
 
Ik doe een goekje

Je doet een "foreach $ARG" wat uiteindelijk een if "===" = "===" oplevert.

Als je de CASE doet op "strtoupper(trim($arg))" dan kun je matchen op alleen FALSE en TRUE, ook al is de input True, true, TRUE, TrUe, etc.

Ja, maar dit lost het probleem niet op. Eerst word ''=== false' uit elkaar gehaald dus, === en false, daarna moet false worden omgezet naar een andere type, namelijk boolean en dit gebeurt alleen word de waarde op ene andere manier veranderd naar true
 
Ja maar het gaat toch om de return value? je definieert een variabele $output, maar je returned "true" dus de uitkomst van de functie is true
 
Nee dat bedoel ik niet. Op regel 94 heb ik een var dump kijk daar eens naar
 
Ah, elke string die niet NULL of empty ("") is converteerd naar "true". De inhoud van de string doet verder niet ter zake.

edit voor de duidelijkheid dus:

settype (String("false") , "bool") === true want string <> ""
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan