2010-08-28 13 views
5

Ich muss eine foreach-Anweisung erstellen, die Bedingungen für eine bedingte Anweisung durchläuft und erstellt. Ich schrieb dieses Stück Code, nicht erwartet, dass es funktioniert, und natürlich ist es nicht ...Platzieren einer foreach-Schleife innerhalb einer if-Bedingung

$filename = "whitelist.txt"; 
$handle = fopen($filename, 'r'); 
$whitelist = fread($handle, filesize($filename)); 
fclose($handle); 
$whitelist = explode("\n", $whitelist); 
if (
    foreach ($whitelist as $value) { 
    strpos($ref, 'http://'.$value.'/')===0 || 
    } 
) 

So soll dies jemals in der Lage sein zu arbeiten? Oder bin ich einfach verrückt? Wenn es wirklich keine Möglichkeit gibt, eine Schleife in den Zustand zu setzen, könnte jemand einen besseren Weg vorschlagen, dies zu tun? Sehr geschätzt!

+3

Es macht keinen Sinn ODER ist es nur ich? – shamittomar

+0

Haha, macht wahrscheinlich keinen Sinn. Ich laufe durch ein Array mit foreach Tests, wenn irgendein Wert im Array einer definierten Zeichenkette entspricht, wenn es eine Sache tut, wenn es eine andere nicht tut. –

Antwort

14

Berechnen Sie den Wert vorher, man kann nicht eine Schleife als Ausdruck verwenden:

$val = false; 

foreach ($whitelist) { 
    $val = $val || strpos($ref, 'http://'.$whitelist.'/')===0; 
} 

if($val) { 
    // ... 
} 
+5

In diesem Fall möchten Sie vielleicht einfach 'if (strpos (...) === 0) {$ val = true; Pause;} weniger Arbeit in einfachen Fällen. – viraptor

+0

Dies funktioniert wunderbar mit ein paar Optimierungen, um meine Situation anzupassen. Vielen Dank für die Aufmerksamkeit Felix! –

+0

@Ben: Gern geschehen. Wie @viraptor sagte, können Sie den Code so verbessern, wie er es beschrieben hat. Denn wenn 'strpos ($ ref, 'http: //'.$whitelist.'/') === 0 'einmal' wahr 'ist, bleibt der ganze Ausdruck wahr, so dass es keinen Sinn hat, weitere Möglichkeiten zu testen. So funktioniert logisches 'ODER'. –

1

Sie haben die beiden Aussagen zu invertieren und die if innerhalb der for Schleife setzen. Wiederholen Sie die Suche über die Whitelist. Wenn Sie eine Übereinstimmung gefunden haben, setzen Sie eine Markierung und beenden Sie die Schleife mit break. Dann überprüfe diese Flagge nach der Schleife und schau, ob sie jemals gesetzt wurde.

$allowed = false; 

foreach ($whitelist as $url) { 
    if (strpos($ref, "http://$url/") === 0) { 
     $allowed = true; 
     break; 
    } 
} 

if ($allowed) { 
    // Do what you want to do. 
} 

Für was es wert ist, gibt es andere ausdrucksstarke Sprachen, in denen Sie den Code so schreiben könnten, wie Sie es versucht haben. In Python, zum Beispiel, könnten Sie schreiben dies:

if any(ref.starts_with('http://'+url+'/') for url in whitelist): 
    # Found a whitelisted URL. 
0

, die nicht getan werden kann, weil ein foreach Block nichts zurückgibt.

Sie wollen etwas wie folgt aus:

if (for_any($whitelist, 
    function ($arg) use ($ref) { return strpos($ref, 'http://'.$arg.'/')===0; }) { 
    /* ... */ 
} 

mit

function for_any(array $arr, $func) { 
    return array_reduce($arr, 
     function ($a, $v) use ($func) { 
      return $a || call_user_func($func, $v); 
     }, true); 
} 
0

Compute die Bedingung innerhalb der Schleife, nicht vorher.

$filename = "whitelist.txt"; 
$handle = fopen($filename, 'r'); 
$whitelist = file($handle) 
fclose($handle); 
foreach ($whitelist as $line) { 
    if(strpos($ref, 'http://'.$line.'/')) { 
     //do stuff 
    } 
    else { 
     // do not do stuff 
    } 
} 
Verwandte Themen