if-Abfrage wird übersprungen

fbfeix

Erfahrenes Mitglied
Hallo

Bei mir wird seltsamerweise der if-Block übersprungen. Ich habe auch extra ein paar "echo's" eingebaut um zu überprüfen ob die Funktion selbst überhaupt ausgerufen wird. (Funktion wird aufgerufen).

Den if-Block überspringt er ganz. nicht einmal der else-Block wird ausgeführt.
Ich hoffe ihr könnt mir helfen.


PHP:
class webpage
{
	function webpage()
	{
	
	}
	
	public $aufrufe = 0;
	public $path = "";
}

function webpagearraycontains($path, $array)
{
	$i = 0;
	$z = 0;
	echo '<br/>Länge des Arrays: '.count($array);
	foreach($array as $item)
	{
		
		echo '<br/>';
		echo '<br/>';
		echo ' '.$item->path . '=' . $path;
		echo '<br/>';
		
		if($item->path == $path)
		{
			return $i;
			echo '<br/> Ist gleich: '.$path;
		}
		else
		{
			return false;
			echo '<br/> Ist nicht gleich: '.$path;
		}
			
		$i++;
	}
}
 
Funktioniert es denn, wenn Du $item->path erstmal in eine Variable übergibst
und jene zum Vergleich nimmst? oder Klammern setzen?
PHP:
$temp=$item->path;
if($temp == $path) {}
// oder
if(($item->path) == $path) {}
mfg chmee
 
Hi,

ist error_reporting/display_errors eingeschaltet? Vielleicht wird dir eine Fehlermeldung vorenthalten.

Best regards
 
Die Funktion dieser Funktion erschliesst sich mir auch nicht.. Egal, wieviele Einträge $array hat, nach dem ersten Schleifendurchgang würde jene Schleife wegen "return xx" abgebrochen/verlassen.. Pack das return ans Ende, hinter die Schleife..


mfg chmee
 
@chmee: funktioniert leider trotzdem nicht.
Die Funktion hat nur den Sinn, den Index des ersten Eintrags der mit $path übereinstimmt auszugeben, oder eben false wenn kein Element vorhanden ist.
 
Dann würd ich es anders schreiben, so endet die Schleife (wenn es überhaupt geht) mit dem ersten Durchgang, entweder gefunden oder false, aber keinesfalls geht dieses Konstrukt die Schleife komplett durch.

PHP:
$result=false;
$i=0;
foreach($array as $item)
    {
        $temp=$item->path;
        echo '<br/>';
        echo ' '.$temp . '=' . $path;
        echo '<br/>';
        
        if($temp == $path)
        {
            $result = $i;
            echo '<br/> Ist gleich: '.$path;
        }
        $i++;
}
return $result;
mfg chmee

@tim: wenn er nur den ersten Eintrag überprüfen wollte, täte Deines reichen. Aber so scheint es nicht.. Und drei Gleichheitszeichen hab ich auch schon überlegt..
 
Zuletzt bearbeitet:
Sorry dass ich solange nicht geantwortet habe.
@tim: danke funktioniert, war aber leider nicht genau das was ich brauchte.

@chmee: danke. funktioniert. Aber ein in Abbruch der Schleife sagen wir mal beim 5. Element(wenn dieses Element übereinstimmen würde) wäre doch schneller als wenn die Schleife das komplette array von zum Beispiel 20 Elementen durchlaufen muss, oder?
 
@fbeix
Dein "If else"-Entwurf wirft aber IMMER beim ersten Eintrag schon ein Return raus, es kommt nie zum zweiten, geschweige denn 5. Eintrag.

ein logisches Beispiel:
Code:
(Durchsuche alle Schubladen)
{
   (Ist der Kugelschreiber drin?)
     { Freu Dich und hör auf zu suchen }
   ansonsten
     { Grummel und hör auf zu suchen }
}
:D Vielleicht hilft es, wenn Du einfach das return aus der else-Bedingung rausnimmst ;)

mfg chmee
 
item: Wenn du eine Funktion hast, warum nicht gleich ein Objekt zurückgeben anstelle des index?
item: Echos nach return werden nie ausgeben, da der Code bei return abbricht

PHP:
//Testdaten
$array = array(
            (object) array('path' => 'abc', 'name' => 'test1'), 
            (object) array('path' => 'def', 'name' => 'test2')
        );
$path = 'def1';

//Aufruf der Funktion
$actObj = getFirstObjectWithPath($array, $path);
if($actObj !== false){
    echo "Ich habe das Objekt '{$actObj->name}' mit dem Pfad '{$actObj->path}' gefunden";
}else{
    echo "kein Objekt mit dem Pfad '{$path}' gefunden";
}


/**
 * getFirstObjectWithPath
 * @param Array<Object> $objects
 * @param String $path
 * @return  Object oder false
 */
function getFirstObjectWithPath($objects, $path){
    foreach($objects as $item){
        if($item->path == $path){               
            return $item;
        }
    }    
    return false;
}
 
Zurück