2012-04-10 15 views
7

मैं फ़ाइल नाम के एक गतिशील रूप से उत्पन्न सरणी है, मान लें कि यह इस तरह दिखता है :कुशल तरीका

$exclude_file_1 = "meta-file-1"; 
$exclude_file_2 = "meta-file-2"; 

तो, मैं हमेशा तत्वों मैं त्याग चाहते हैं के मूल्यों, लेकिन नहीं कुंजी पता चल जाएगा।

वर्तमान में मैं ऐसा करने के कुछ तरीके देख रहा हूं। एक तरह से, array_filter और एक कस्टम फ़ंक्शन का उपयोग:

function excludefiles($v) 
     { 
     if ($v === $GLOBALS['exclude_file_1'] || $v === $GLOBALS['exclude_file_2']) 
      { 
      return false; 
      } 
     return true; 
     } 

$files = array_values(array_filter($files,"excludefiles")); 

एक और तरीका है, using array_keys and unset:

$exclude_files_keys = array(array_search($exclude_file_1,$files),array_search($exclude_file_2,$files)); 
foreach ($exclude_files_keys as $exclude_files_key) 
    {  
    unset($files[$exclude_files_key]); 
    } 
$files = array_values($page_file_paths); 

दोनों तरीकों वांछित परिणाम उपज।

मैं बस सोच रहा हूं कि कौन सा अधिक कुशल होगा (और क्यों)?

या शायद ऐसा करने के लिए एक और अधिक प्रभावी तरीका है?

शायद array_search फ़ंक्शन में एकाधिक खोज मान रखने का कोई तरीका है?

+0

हाय फेएन - स्वीकार्य उत्तर मिलने के बाद शीर्षक को बदलने की आवश्यकता नहीं है। StackOverflow उन सभी का ख्याल रखता है जो एक बार जब आप हरे रंग की चेक-मार्क हिट करते हैं :) –

+0

नोट किया गया, धन्यवाद @ माइकबी :) – Feanne

उत्तर

17

आप बस array_diff उपयोग करना चाहिए:

$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file"); 
$exclude_file_1 = "meta-file-1"; 
$exclude_file_2 = "meta-file-2"; 

$exclude = array($exclude_file_1, $exclude_file_2); 
$filtered = array_diff($files, $exclude); 

बुरा चीज़ों में से एक के बारे में पीएचपी यह विशिष्ट थोड़ा काम करने के लिए कार्यों के zillions है कि है, लेकिन यह भी बाहर कर देते हैं कभी कभी सुविधाजनक हो सकता है।

जब आप इस तरह की स्थिति में आते हैं (आपको एक प्रासंगिक फ़ंक्शन का पता लगाने के बाद समाधान मिल गया है, लेकिन यदि कुछ बेहतर है तो आप अनिश्चित हैं), php.net पर फ़ंक्शन सूची साइडबार ब्राउज़ करना एक अच्छा विचार है फुर्सत। बस फंक्शन नाम पढ़ना भारी लाभांश का भुगतान कर सकता है।

+0

बहुत बहुत धन्यवाद @ जोन - मुझे आपकी सलाह याद आएगी। मैं अवकाश में फ़ंक्शन सूची पढ़ता हूं, लेकिन कभी भी "diff" फ़ंक्शंस पर अधिक ध्यान नहीं देता क्योंकि मैं कल्पना नहीं कर सकता कि मैं उनका उपयोग कैसे करूं ... अब मैं बेहतर जानता हूं! :) – Feanne

+0

क्या होगा यदि वे तत्व तार नहीं हैं लेकिन ऑब्जेक्ट या सरणी हैं? और मैं उन तत्वों को हटाना चाहता हूं जिनमें उदाहरण के लिए 'ए' और 'बी' के लिए कुछ संपत्ति eqlual है? – Herokiller

+0

@ हेरोकिल्लर उस मामले में आपको 'array_filter' के साथ जाना होगा। – Jon

1

उपयोग array_diff()

$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file"); 
$exclude_file_array = array("meta-file-1", "meta-file-2"); 

$ exclude_file_array कि $ फ़ाइलों में नहीं हैं से सभी तत्वों के साथ एक सरणी वापस आ जाएगी।

$new_array = array_diff($files, $exclude_file_array); 

यह आपके स्वयं के फ़ंक्शन और लूप से बेहतर है।

+0

धन्यवाद, यह इंगित किया गया है और मैंने इसे अपने कोड में लागू किया है। – Feanne

+0

आपका स्वागत है @ फीन के रूप में जॉन ने कहा कि पहले php.net ब्राउज़ करें जो बहुत अच्छा होगा .. अच्छी नौकरी। –

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