2011-03-18 9 views
7

सॉर्ट किए बिना मैं एक autoloader बना रहा हूं जो include_path को बढ़ाता है। यह एक सरणी लेता है, विस्फोट() डी को पथ शामिल करता है, वर्तमान निर्देशिका के सभी संदर्भों को हटा देता है, सरणी की शुरुआत में एक एकल निर्देशिका जोड़ता है, और आखिर में पूरी चीज़ को एक साथ शामिल करने के लिए एक साथ शामिल करें । नीचे दिए गए कोडarray_unique()

<?php 
static public function extendIncludePath (array $paths) 
{ 
    // Build a list of the current and new paths 
    $pathList = array_merge (explode (PATH_SEPARATOR, $paths), explode (PATH_SEPARATOR, get_include_path())); 
    // Remove any references to the current directory from the path list 
    while ($key = array_search ('.', $pathList)) 
    { 
     unset ($pathList [$key]); 
    } 
    // Put a current directory reference to the front of the path 
    array_unshift ($pathList, '.'); 
    // Generate the new path list 
    $newPath = implode (PATH_SEPARATOR, $pathList); 
    if ($oldPath = set_include_path ($newPath)) 
    { 
     self::$oldPaths [] = $oldPath; 
    } 
    return ($oldPath); 
} 
?> 

मैं भी यह imploding से पहले सरणी पर array_unique() का उपयोग करने के लिए इतना है कि पीएचपी अगर किसी लापरवाह है एक ही स्थान पर देख कई बार नहीं रखता चाहते थे सूचीबद्ध और अधिक एक ही पथ निर्दिष्ट करता है एक बार से अधिक। हालांकि, मुझे सरणी के क्रम क्रम को बनाए रखने की भी आवश्यकता है क्योंकि निर्देशिका में शामिल पथ में परिभाषित क्रम में निर्देशिका में दिखता है। मैं पहले वर्तमान निर्देशिका में देखना चाहता हूं, फिर खोज निर्देशिकाओं की मेरी सूची और आखिरकार मूल में पथ शामिल है ताकि, उदाहरण के लिए, डिफ़ॉल्ट में एक सामान्य लाइब्रेरी का पुराना संस्करण शामिल है Ipath को एक नए संस्करण के पक्ष में शामिल नहीं किया गया है मेरी खोज सूची में।

इन कारणों से मैं array_unique() का उपयोग नहीं कर सकता क्योंकि यह सरणी की सामग्री को टाइप करता है।

क्या मेरे सरणी में तत्वों के क्रम को संरक्षित करने के लिए array_unique प्राप्त करने का कोई तरीका है?

+0

क्रमबद्ध करें: '$ सरणी = array_flip (array_flip ($ सरणी))' एक आप के लिए विकल्प है? ('array_flip' कुंजी के साथ मानों को स्वैप करता है, और चूंकि कुंजी हमेशा अनूठी होती हैं, इसलिए एक डबल 'array_flip' आपके सरणी में मानों को अद्वितीय बनाता है।) – pinkgothic

उत्तर

7

सरणी_निक() सीधे उपयोग नहीं कर रहा है;

$temp = array(); 

foreach ($original_array as $value) { 
    $temp[$value] = 1; 
} 

$original_array = array_keys($temp); 
1

कुछ तरह के मूल पुन: आदेश) कुंजी की रक्षा, ताकि आप एक ksort (कर सकते हैं बाद में करता है। आपको अपने फ़ंक्शन परिणाम

पर आपकी अनूठी सरणी परिणाम प्राप्त होगा, यह आपकी सरणी सॉर्ट सामग्री को तोड़ नहीं देता है।

संदर्भ: http://php.net/manual/en/function.array-count-values.php आपकी पूछताछ को दरकिनार करने का

+0

हेड-अप: उस लूप के लिए एक फ़ंक्शन है [प्रभावी ढंग से; यदि आपको मूल्य '1' होने की परवाह नहीं है]। 'Array_flip()'। :) – pinkgothic

+1

अरे अरे मैं PHP नियम # 0 पर गिर गया: हमेशा एक PHP फ़ंक्शन होता है जिसे आपने कभी नहीं सुना है :) –

+0

बहाहा। : डी * PHP कार्यों में एक गाना गाता है जो सुरक्षित मार्ग के लिए प्रार्थना करते हुए, अचेतन पर हमला करने के लिए प्रतीक्षा में रहना चाहता है! * – pinkgothic

2

आप भी array_count_value उपयोग कर सकते हैं: लेकिन array_unique प्रविष्टियों

+0

ओह, रचनात्मक दृष्टिकोण! उत्सुकता के लिए क्विकफ: '$ अद्वितीय = array_keys (array_count_values ​​($ स्रोत));' – pinkgothic