2009-04-24 10 views
6

मैं इस तरह कुछ करना चाहता हूँ:PHP में "foreach x को छोड़कर" करने का सबसे शानदार तरीका क्या है?

foreach ($array as $key=>$value except when $key="id") 
{ 
// whatever 

} 

... पाश के शरीर के अंदर एक "अगर" खंड डाल करने के लिए बिना। यह गारंटी नहीं है कि "आईडी" सरणी में पहला या अंतिम तत्व होगा, और मैं वास्तव में सरणी को अनसेट या टुकड़ा नहीं करना चाहता, क्योंकि यह महंगा, बदसूरत और मूल डेटा को बनाए रखेगा। मुझे लूप के अंदर दोनों कुंजी और मूल्य का भी उपयोग करने की ज़रूरत है।

कोई विचार?

उत्तर

14

मुझे नहीं लगता है कि अगर-खंड ऐसी समस्या है:

foreach ($array as $key => $value) { 
    if ($key == 'ignore_me') continue; 
    if ($key == 'ignore_me_2') continue; 

आप एक फैंसी समाधान चाहते हैं, तो आप उपयोग कर सकते हैं array_diff_key:

$loop_array = array_diff_key($actual_array, array('ignore_me' => NULL, 'ignore_me_2' => NULL)); 
foreach ($loop_array as $key => $value) { 
    #... 
+1

जो काम करना चाहिए, लेकिन एक ढेर की अधिक स्मृति की आवश्यकता है क्योंकि यह सरणी की एक और प्रति बनाता है। – Alnitak

+0

महंगा लग रहा है ... – Thilo

+0

हां यह है कि इसे प्रतिबिंबित करने के लिए उत्तर बदल दिया गया है। – soulmerge

2

मुझे लगता है कि आप हमेशा आंतरिक लूप में आईएफ क्लॉज का उपयोग करने के लिए समाप्त हो जाएंगे। आपके द्वारा पहले से दिए गए सभी विकल्पों में से केवल यही है कि मैं गति और स्मृति खपत के लिए उपयोग करूंगा

1

AFAIK आप लूप में if के बिना ऐसा नहीं कर सकते हैं।

कीवर्ड की तरह, यह "प्रत्येक के लिए" है, न कि "अधिकांश के लिए"।

संपादित करें: soulmerge कहते हैं की तरह, आप यह array_diff_key() के साथ कर सकता है, लेकिन अगर आप केवल एक ही कुंजी से वंचित रह जाएंगे इसे और अधिक वर्बोज़ और बस पाश में if डालने की तुलना में कम स्मृति कुशल है।

5

अगर- साथ जाओ लूप के अंदर खंड। इसके बारे में कुछ भी सुरुचिपूर्ण नहीं है, इसे पढ़ने और समझने में सबसे आसान है, और यह सबसे कुशल है।

आपको छोड़ देना चाहिए आप (यदि-खंड में) के खिलाफ परीक्षण करने के लिए एक दूसरे हैश बना सकते हैं कई कुंजी है:

foreach ($array as $key => $value) { 
    if (array_key_exists($key,$skip_keys)) continue; 
    ... 
} 
0

if बयान संकुचित का एक और तरीका है:

// ignore 1,5,8,9 
foreach($arr as $key){ 
    if(in_array($key, array(1,5,8,9)) continue; 
    ... 
} 
संबंधित मुद्दे

 संबंधित मुद्दे