2013-02-26 220 views
5

मैं एक सरणी है:फिर व्यवस्था php साहचर्य सरणी

switch($type) 

case 'a': 
//arrange the example array as one, two three 
break; 

case 'b': 
//arrange the example array as two, one, three 
break; 

case 'c': 
//arrange the example array in some other arbitrary manner 
break; 

foreach($example as $value){ 
     echo $value; 
} 
: पहले foreach पाश मेरी उत्पादन प्रक्रियाओं

$example = array(); 

$example ['one'] = array('first' => 'blue', 
          'second' => 'red'); 

$example ['two'] = array('third' => 'purple', 
          'fourth' => 'green'); 

$example ['three'] = array('fifth' => 'orange', 
          'sixth' => 'white'); 

कार्य करने के लिए कुछ इनपुट के आधार पर, मैं उदाहरण सरणी के आदेश को बदलने की जरूरत

क्या मेरे सभी कोड पुनः इंजीनियरिंग के बिना ऐसा करने का कोई आसान तरीका है? मेरे पास एक सुंदर इंडिपथ फ़ोरैच लूप है जो प्रोसेसिंग करता है और यदि हर बार सरणी को फिर से ऑर्डर करने का आसान तरीका होता है जो वास्तव में सहायक होगा।

+2

आपके "मनमानी सरणी सॉर्टिंग का उद्देश्य क्या है?" क्या आप बस ऑर्डर यादृच्छिक करने की कोशिश कर रहे हैं? या, क्या आप विशेष रूप से वस्तुओं को एक पैरामीट्रिक फैशन में बदलना चाहते हैं? – user1477388

+0

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

उत्तर

2

आप अपने परिवर्तन के लिए array_multisort उपयोग कर सकते हैं के लिए कस्टम छँटाई कार्यों बनाने । मुझे लगता है कि आप क्रमपरिवर्तन जानते हैं और इसे मुख्य नामों से प्राप्त करने की आवश्यकता नहीं है। कहो, आप two, three, one, तो ऐसे ही एक संदर्भ सरणी बनाने हैं:

$permutation = array(3, 1, 2); 

अर्थ: पहला आइटम 3 स्थिति को जाता है, दूसरे मद 1 स्थिति, तीसरे आइटम स्थिति 2

फिर, switch, दूसरे स्थान पर रखना के बाद:

array_multisort($permutation, $example); 

यह $permutation सरणी सॉर्ट और करने के लिए एक ही आदेश लागू होगी $example

+0

क्योंकि मैं संख्यात्मक कुंजी का उपयोग नहीं कर रहा हूं क्रमपरिवर्तन सरणी काम करेगा? ऐसा लगता है कि यह मेरे लिए रास्ता है क्योंकि आप बिल्कुल सही हैं कि मुझे प्रत्येक स्थिति के लिए क्रमपरिवर्तन पता है। – absentx

+0

इसमें चाबियों के साथ कुछ लेना देना नहीं है और array_multisort गैर-संख्यात्मक कुंजी को संरक्षित करता है, इसलिए: हाँ, यह –

+0

काम करेगा Yep यह करने का तरीका था, धन्यवाद।मेरे सिर को क्रमपरिवर्तन के चारों ओर लपेटने के लिए थोड़ा सा लगा (उन्हें थोड़ी देर में उपयोग नहीं करना पड़ा) लेकिन आखिरकार यह सबसे आसान तरीका था क्योंकि मुझे प्रत्येक मामले का आदेश पता था। – absentx

0

आपको प्रत्येक मामले के लिए एक कस्टम सॉर्ट फ़ंक्शन लिखना होगा और फिर का उपयोग करना होगा। पहला मामला बस प्रकार का उपयोग कर सकता था। मनमाने ढंग से आपको परिभाषित तर्क होना चाहिए।

2

आपको यहां चांदी के बुलेट का जवाब नहीं मिल रहा है। आपको शायद uksort() के साथ उपयोग के लिए अपना स्वयं का फ़ंक्शन लिखने की आवश्यकता होगी।

uksort($example, function ($a, $b) use $type { 
    switch($type) { 
     case 'a': 
      if ($a === 'one' || $b === 'three') return 1; 
      if ($a === 'three' || $b === 'one') return -1; 
      if ($a === 'two' && $b === 'three') return 1; 
      return -1; 
      break; 
     // and so on... 
    } 
}); 
0

मुझे इसे हल करने के अधिक तरीके दिखाई देते हैं, लेकिन मुझे नहीं पता कि मुझे क्या पता है कि बेहतर क्या है।

  1. एक पूर्व स्कोर (प्रत्येक तत्व के लिए एक अंकीय मान, अपने "बहुत गहराई foreach लूप" में गणना कर), तो मुख्य और एकल मापदंड के रूप में उपयोग यह द्वारा सरणी सॉर्ट करें।

  2. आपके मानदंड ही संख्यात्मक फ़ील्ड एएससी के आधार पर कर रहे हैं/DESC का उपयोग http://php.net/manual/en/function.array-multisort.php

  3. प्रत्येक मामले (http://www.php.net/manual/en/function.usort.php)