2010-02-17 12 views
16

मैं इस प्रकार प्रत्येक टैग की आवृत्तियां की संख्या के साथ टैग की एक सूची में उपयोग के लिए संख्यात्मक मान के साथ स्ट्रिंग कुंजी की एक सरणी है,:PHP सरणी एकाधिक प्रकार - मूल्य के बाद कुंजी द्वारा?

$arrTags['mango'] = 2; 
$arrTags['orange'] = 4; 
$arrTags['apple'] = 2; 
$arrTags['banana'] = 3; 

इस तो मैं आदेश घटना घटते हुए टैग सूची प्रदर्शित कर सकते हैं इस प्रकार:

orange (4) 
banana (3) 
mango (2) 
apple (2) 

मैं मूल्य जो शानदार है, लेकिन मैं भी किसी भी टैग एक ही संख्यात्मक मान है वर्णानुक्रम में क्रमित जाना चाहते हैं, तरह उल्टा करने के लिए arsort उपयोग कर सकते हैं, तो अंतिम परिणाम हो सकते हैं:

orange (4) 
banana (3) 
apple (2) 
mango (2) 

क्या ऐसा कोई तरीका है जिससे मैं यह कर सकता हूं? मुझे लगता है कि usort जाने का तरीका हो सकता है लेकिन मैं php.net पर उदाहरण देखता हूं और मेरी आंखें चमकती हैं! बहुत धन्यवाद!!!

उत्तर

12

उदाहरण पर एक नज़र डालें # 3: http://php.net/manual/en/function.array-multisort.php

आप दो सरणियों अनुक्रमित के रूप में उपयोग करने के लिए बनाने की आवश्यकता होगी; मूल सरणी की चाबियों और मूल सरणी के मूल्यों में से एक बना है।

फिर टेक्स्ट मानों (मूल सरणी की चाबियाँ) और फिर संख्यात्मक मानों (मूल सरणी के मान) द्वारा क्रमबद्ध करने के लिए बहुआयामी का उपयोग करें।

+3

@MMior तो जटिल समाधान क्या है? –

+1

एक अच्छा कार्यान्वयन उदाहरण के लिए @ जोन बर्नार्ड बोले देखें। –

0

मैंने कोशिश नहीं की है, लेकिन क्या आपने पहले आरोही कुंजी को सॉर्ट करने का प्रयास किया है, फिर मूल्यों को क्रमबद्ध करना है?

ऐसा लगता है कि अधिकतर प्रकार तत्वों को चारों ओर स्थानांतरित नहीं करेंगे यदि वे पहले से ही समान हैं।

0

आप रिक्त सरणी बनाने के लिए केवल एक फ़ंक्शन बना सकते हैं और तुलना के आधार पर उन्हें सम्मिलित कर सकते हैं।

0

तुम भी जटिल सोच रहे हैं:

ksort($arrTags); 
arsort($arrTags); 

अब आप अपने सरणी सॉर्ट हो जाता है जैसे आप यह करना चाहते हैं।

+0

मैं बस इस सटीक उत्तर को पोस्ट करने वाला था। वैसे भी, इसे आजमाया और मैं पुष्टि कर सकता हूं कि यह काम करता है। –

+3

PHP प्रकार स्थिर नहीं हैं, इसलिए आपको गारंटी नहीं है कि यह काम करेगा। http://www.php.net/manual/en/array.sorting.php – goat

+0

@ क्रिस, यह सच है लेकिन मुझे अभी भी कोई भी मामला नहीं मिला है जहां यह काम नहीं करेगा, इसलिए मैं इसके साथ आगे बढ़ूंगा। –

13

हल

एक छोटे से प्रयोग मुझे पता चला कि array_multisort चाल अच्छी तरह से करता है के बाद:

$tag = array(); 
$num = array(); 

foreach($arrTags as $key => $value){ 
$tag[] = $key; 
$num[] = $value; 
} 

array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags); 

:)

+2

वह SlappyTheFish का जवाब होगा, है ना? मुझे लगता है कि आपको उस उत्तर को स्वीकार किए जाने के रूप में चिह्नित करना चाहिए और फिर अपने लूप से छुटकारा पाने के लिए array_keys() और array_values ​​() फ़ंक्शंस को देखना चाहिए। –

+2

भविष्य के आगंतुकों के लिए भी एक नोट: '$ टैग = array_keys ($ arrTags); $ num = array_values ​​($ arrTags); 'लूप के बिना समान सरणी बनाएगा। – nickb

+0

यह मेरे लिए क्यों काम नहीं कर रहा है? मैं उपर्युक्त नमूना और समाधान की प्रतिलिपि सिर्फ प्रश्न में एक ही परिणाम मिला। –

2

SlappyTheFish सही फिर से है: का उपयोग कर array_multisort बनाम ksort, arsort

डेविड के उदाहरण में ksort में, arsort ठीक काम करता है, हालांकि अगर के ys 'स्ट्रिंग मानों में वर्णमाला वर्णों के अलावा वर्ण होते हैं, क्रमबद्ध रूप से कार्य नहीं कर सकता है।

पूर्व:

$arrTags['banana'] = 3; 
$arrTags['mango'] = 2; 
$arrTags['apple1'] = 2; 
$arrTags['orange'] = 4; 
$arrTags['almond1'] = 2; 

ksort($arrTags); 
arsort($arrTags); 

print_r($arrTags); 

रिटर्न:

Array 
(
    [orange] => 4 
    [banana] => 3 
    [apple1] => 2 
    [mango] => 2 
    [almond1] => 2 
) 

तथापि का उपयोग कर:

$arrTags['banana'] = 3; 
$arrTags['mango'] = 2; 
$arrTags['apple1'] = 2; 
$arrTags['orange'] = 4; 
$arrTags['almond1'] = 2; 

$tag = array(); 
$num = array(); 

foreach($arrTags as $key => $value){ 
    $tag[] = $key; 
    $num[] = $value; 
} 

array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags); 


print_r($arrTags); 

रिटर्न:

Array 
(
    [orange] => 4 
    [banana] => 3 
    [almond1] => 2 
    [apple1] => 2 
    [mango] => 2 
) 
28

स्कॉट सॉंडर्स डेविड के समाधान पर अपनी टिप्पणी में संकेत देते हैं, आप लूप से छुटकारा पाने के लिए array_keys() और array_values ​​() फ़ंक्शंस का उपयोग कर सकते हैं। वास्तव में, आप कोड की एक पंक्ति में इस का समाधान कर सकते हैं:

array_multisort(array_values($arrTags), SORT_DESC, array_keys($arrTags), SORT_ASC, $arrTags); 
+0

इस कोड के लिए धन्यवाद। मेरे पास मूल प्रश्न के रूप में सटीक स्थिति है और यह मेरे लिए काम करता है। मुझे परेशान करने वाला यह है कि मुझे बिल्कुल यकीन नहीं है कि यहां क्या हो रहा है। अंतिम पैरामीटर का कार्य क्या है? मैं देख सकता हूं कि अंतिम पैरामीटर (संदर्भ द्वारा पारित किया जा रहा है) बदली गई सरणी को वापस करने के लिए एकमात्र संभावना है, ठीक है। लेकिन एक दूसरे से संबंधित सरणी सेट कैसे हैं? जब मल्टीसार्ट अपने काम को बाएं से दाएं चला जाता है तो बाद के सरणी उनके साथ क्रमबद्ध होते हैं। यदि ऐसा है तो सभी सरणी में एक ही लंबाई होनी चाहिए जो दस्तावेज़ीकरण द्वारा आवश्यक नहीं है।#confused – andypotter

+0

@andypotter: असल में, 'array_multi_sort() 'आंतरिक रूप से एक और सरणी' $ अप्रत्यक्ष 'बनायेगा जहां प्रत्येक अनुक्रमणिका एक सरणी है जिसमें प्रदान किए गए सरणी के सभी मान होते हैं:' $ अप्रत्यक्ष [$ i] = [$ v1, $ v2, $ v3, ..., NULL] '। फिर क्विकस्टोर्ट को एक विशेष तुलनात्मक फ़ंक्शन का उपयोग करके सरणी पर लागू किया जाता है जो पहले '$ अप्रत्यक्ष [$ a] [$ r] '' $ अप्रत्यक्ष [$ b] [$ r] '' $ r == 0' की तुलना करेगा। वे बराबर हैं, '$ आर' बढ़ी है जब तक कि $ अप्रत्यक्ष [$ ए] [$ आर]' शून्य नहीं है (सभी प्रदान किए गए सरणी का उपयोग किया गया है)। आखिरकार प्रत्येक सरणी को '$ अप्रत्यक्ष' के अनुसार लिखा जाता है। यदि आप विभिन्न आकार के सरणी का उपयोग करते हैं, तो FALSE वापस आ गया है। – 2072

+0

शानदार - धन्यवाद जॉन! – Martin

5

पिछले प्रस्तावित समाधान तार्किक लगता है, लेकिन यह सिर्फ काम doens't:

ksort($arrTags); 
arsort($arrTags); 

पूरा PHP कोड का एहसास करने के लिए कहा छँटाई, जाएगा:

$k = array_keys($arrTags); 
$v = array_values($arrTags); 
array_multisort($k, SORT_ASC, $v, SORT_DESC); 
$arrTags = array_combine($k, $v); 

कृपया ध्यान दें कि array_multisort() उपयोगकर्ता इनपुट पर संदर्भ का उपयोग करता है, तो आप दो अस्थायी variabels ($ कश्मीर और $ v) उपयोगकर्ता इनपुट के रूप में सामग्री की आपूर्ति करने का उपयोग करना होगा। इस तरह array_multisort() सामग्री को बदल सकता है। बाद में, array_combine() के माध्यम से क्रमबद्ध सरणी का पुनर्निर्माण करें।

मैं इस कार्य को पूरा करने के लिए एक पुन: प्रयोज्य समारोह का निर्माण किया है:

<?php 
/** 
* Sort a multi-dimensional array by key, then by value. 
* 
* @param array Array to be sorted 
* @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING 
* @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING 
* @return void 
* @example The following array will be reordered: 
* $a = array(
*  'd' => 4, 
*  'c' => 2, 
*  'a' => 3, 
*  'b' => 1, 
*  'e' => 2, 
*  'g' => 2, 
*  'f' => 2, 
* ); 
* SortArrayByKeyThanValue($a);  # reorder array to: array(
*  'b' => 1, 
*  'c' => 2, 
*  'e' => 2, 
*  'f' => 2, 
*  'g' => 2, 
*  'a' => 3, 
*  'd' => 4, 
* ); 
* @author Sijmen Ruwhof <sijmen(a)secundity.com> 
* @copyright 2011, Secundity 
*/ 
function SortArrayByKeyThanValue (&$pArray, $pSortMethodForKey = SORT_ASC, $pSortMethodForValue = SORT_ASC) 
{ 
    # check user input: sorting is not necessary 
    if (count($pArray) < 2) 
     return; 

    # define $k and $v as array_multisort() needs real variables, as user input is put by reference 
    $k = array_keys ($pArray); 
    $v = array_values($pArray); 

    array_multisort(
     $v, $pSortMethodForValue, 
     $k, $pSortMethodForKey 
    ); 
    $pArray = array_combine($k, $v); 
} 
?> 
0
//preserve arrays keys for later use 
$ar1= array_keys($your_array); 

//preserve array's values for later use 
$ar2= array_values($your_array); 

//perform sorting by value and then by key 
array_multisort($ar2, SORT_DESC, $ar1, SORT_DESC); 

//combine sorted values and keys arrays to new array 
$sorted_array = array_combine($ar1, $ar2); 

ठीक होना चाहिए।

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