6 Stimmen

Platzieren einer foreach-Schleife innerhalb einer if-Bedingung

Ich muss eine foreach-Anweisung erstellen, die durchlaufen wird und Bedingungen für eine bedingte Anweisung erstellen. Ich schrieb dieses Bit von Code, nicht erwarten, dass es funktioniert, und natürlich hat es nicht...

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

Sollte dies also jemals funktionieren können? Oder bin ich einfach nur verrückt? Wenn es wirklich keine Möglichkeit gibt, eine Schleife in die Bedingung wie diese zu setzen, könnte jemand einen besseren Weg vorschlagen, dies zu tun? Ich bin Ihnen sehr dankbar!

15voto

Felix Kling Punkte 751464

Berechnen Sie den Wert vorher, Sie können eine Schleife nicht als Ausdruck verwenden:

$val = false;

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

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

1voto

John Kugelman Punkte 327535

Sie müssen die beiden Anweisungen umkehren und die if innerhalb der for Schleife. Durchlaufen Sie die Whitelist in einer Schleife, und sobald Sie eine Übereinstimmung gefunden haben, setzen Sie eine Markierung und verlassen die Schleife mit break . Prüfen Sie dann nach der Schleife, ob das Flag 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.
}

Was auch immer es wert ist, es gibt andere, ausdrucksstärkere Sprachen, in denen man den Code so schreiben kann, wie Sie es versucht haben. In Python zum Beispiel könnte man dies schreiben:

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

0voto

Artefacto Punkte 93200

Das ist nicht möglich, weil ein foreach Block gibt nichts zurück.

Sie wollen so etwas wie das hier:

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

0voto

Levi Hackwith Punkte 9132

Berechnen Sie 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
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X