2010-08-28 11 views
5

मैं एक foreach बयान है कि के माध्यम से चलाने के लिए और एक सशर्त बयान के लिए शर्तों पैदा करेगा बनाने के लिए की आवश्यकता होगी, कर रहा हूँ के अंदर एक foreach पाश लगाकर। मैं कोड के इस बिट लिखा था, यह काम करने की उम्मीद नहीं है, और निश्चित रूप से ऐसा नहीं किया ...एक अगर हालत

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

तो, यह कभी काम करने में सक्षम होना चाहिए? या मैं बस पागल हूँ? यदि वास्तव में इस तरह की स्थिति में एक पाश डाल करने के लिए कोई रास्ता नहीं है, किसी को यह करने के लिए एक बेहतर तरीका सुझाव है कि सकता है? बहुत सराहना की!

+3

यह कोई मतलब नहीं है या यह मेरे बस है? – shamittomar

+0

Haha, शायद कोई मतलब नहीं पड़ता है। मैं फोरैच परीक्षण के साथ एक सरणी के माध्यम से चल रहा हूं यदि सरणी में कोई भी मान परिभाषित स्ट्रिंग से मेल खाता है, अगर यह एक काम करता है, अगर यह कोई दूसरा नहीं करता है। –

उत्तर

14

कंप्यूट मूल्य पहले से, आप अभिव्यक्ति के रूप में एक पाश का उपयोग नहीं कर सकते हैं:

$val = false; 

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

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

उस स्थिति में आप बस 'अगर (स्ट्रॉप्स (...) === 0) {$ val = true; ब्रेक;} 'आसान मामलों में कम काम करने के लिए। – viraptor

+0

यह मेरी स्थिति फिट करने के लिए सुधार करने का एक सा के साथ खूबसूरती से काम करता है। ध्यान फेलिक्स के लिए बहुत बहुत धन्यवाद! –

+0

@ बेन: आपका स्वागत है। जैसा कि @viraptor ने कहा था, आप जिस तरह से वर्णित कोड को बेहतर बना सकते हैं। क्योंकि यदि 'स्ट्रॉप्स ($ ref,' http: //'.$whitelist.'/ ') === 0' एक बार' सत्य 'है, तो संपूर्ण अभिव्यक्ति सत्य रहेगी, इसलिए आगे की संभावनाओं का परीक्षण करने में कोई बात नहीं है। यह सिर्फ तार्किक 'OR' काम करता है। –

1

आप दो बयानों को उलटने और for पाश अंदर if डाल करने के लिए की है। श्वेत सूची से अधिक लूप, और एक बार आप एक मैच एक ध्वज सेट खोजने के लिए और पाश break का उपयोग कर से बाहर निकलें। फिर लूप के बाद उस ध्वज को जांचें और देखें कि यह कभी भी सेट हो गया है या नहीं।

$allowed = false; 

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

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

इसके लायक होने के लिए, अन्य अभिव्यक्तिपूर्ण भाषाएं हैं जहां आप जिस तरीके से कोशिश कर रहे थे, वह कोड लिख सकते हैं। अजगर में, उदाहरण के लिए, तो आप इस लिख सकते हैं:

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

क्योंकि एक foreach ब्लॉक कुछ भी नहीं देता है नहीं किया जा सकता है। साथ

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

कंप्यूट पाश अंदर हालत, पहले से नहीं

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

:

आप कुछ इस तरह करना चाहते हैं।

$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 
    } 
} 
संबंधित मुद्दे