2011-01-03 12 views
46

मैं इसपीएचपी तरह सरणी को महत्व देता

 
Array (
[0] => Array("destination" => "Sydney", 
       "airlines" => "airline_1", 
       "one_way_fare" => 100, 
       "return_fare => 300 
     ), 
[2] => Array("destination" => "Sydney", 
       "airlines" => "airline_2", 
       "one_way_fare" => 150, 
       "return_fare => 350 
     ), 
[3] => Array("destination" => "Sydney", 
       "airlines" => "airline_3", 
       "one_way_fare" => 180, 
       "return_fare => 380 
     ) 
) 

की तरह एक सरणी कैसे मैं return_fare एएससी द्वारा मूल्य सॉर्ट कर सकते हैं कर दिया है, एएससी one_way_fare?

मैं array_multisort() की कोशिश की, लेकिन मैं .. मिश्रित डेटा प्राप्त करने

asort केवल एक आयामी सरणी के लिए काम करता है समाप्त हो गया, मैं कैसे मैं एसक्यूएल, आदेश से में इस तरह प्राप्त कर सकते हैं दो मानों या अधिक से सॉर्ट करने के लिए की जरूरत है, field1 asc, field2 asc?

उत्तर

73

array_multisort() सही समारोह, तो आप किसी भी तरह में गड़बड़ होना चाहिए है:

// Obtain a list of columns 
foreach ($data as $key => $row) { 
    $return_fare[$key] = $row['return_fare']; 
    $one_way_fare[$key] = $row['one_way_fare']; 
} 

// Sort the data with volume descending, edition ascending 
array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data); 

आप array_multisort() के लिए PHP मैनुअल पेज पर टिप्पणी पर एक नज़र डालें, तो आप एक बहुत ही उपयोगी array_orderby() समारोह है जो आप की अनुमति देता है प्राप्त कर सकते हैं ऊपर सिर्फ इस लिए छोटा करने के लिए:

$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC); 

(पीएचपी 5.5.0 के रूप में) पाशन उपयोग array_column() बचने के लिए:

array_multisort(array_column($data, 'return_fare'), SORT_ASC, 
       array_column($data, 'one_way_fare'), SORT_ASC, 
       $data); 
+0

धन्यवाद ..! मुझे लगता है कि मैंने वही किया जैसा आपने सलाह दी थी। मैन्युअल पेज टिप्पणियों पर हालांकि array_orderby() फ़ंक्शन नहीं मिल सकता है – flyclassic

+2

@flyclassic, पहली टिप्पणी: http://www.php.net/manual/en/function.array-multisort.php#100534 –

+0

धन्यवाद .. अब मैं इसे देखता हूं .. – flyclassic

1

ओह, मैं अपने ही सवाल का फिर से हल करने में कामयाब रहे ....

function array_multi_sort($array, $on1,$on2, $order=SORT_ASC) 
{ 

    foreach($array as $key=>$value){ 
     $one_way_fares[$key] = $value[$on2]; 
     $return_fares[$key] = $value[$on1]; 
    } 

    array_multisort($return_fares,$order,$one_way_fares,$order,$array); 
} 

बात मैं array_multisort($return_fares,$order,$one_way_fares,$order,$array);

पहले पिछले पैरामीटर $ सरणी से चूक गए है!

27

array_multisort() के अलावा, आपको पहले कॉलम-एरे बनाने की आवश्यकता है, usort() भी है जो ऐसी चीज की आवश्यकता नहीं है।

usort($data, function($a, $b) { 
    $rdiff = $a['return_fare'] - $b['return_fare']; 
    if ($rdiff) return $rdiff; 
    return $a['one_way_fare'] - $b['one_way_fare']; 
}); // anonymous function requires PHP 5.3 - use "normal" function earlier 
+7

या अधिक जल्द ही, '$ [' return_fare '] - $ b [' return_fare '] वापस लौटें?: एक [' one_way_fare '] - $ b [' one_way_fare ']; 'सब कुछ' array_multisort()' से अधिक प्राकृतिक लगता है। –

9

या के रूप में

uasort($arr, function($a,$b){ 
    $c = $a['return_fare'] - $b['return_fare']; 
    $c .= $a['one_way_fare'] - $b['one_way_fare']; 
    return $c; 
}); 

Fiddle

+0

पहेली त्रुटि देता है। – horse

+0

@ user2356198 आपको कौन सी त्रुटि मिल रही थी।क्या आप कृपया मुझे बता सकते हैं कि मेरे लिए यह ठीक काम कर रहा है –

+0

यह अभी ठीक है, मैंने सही कंपाइलर का चयन नहीं किया है। – horse

3

एक और उदाहरण अंतरिक्ष यान ऑपरेटर का उपयोग इस प्रकार आप uasort उपयोग कर सकते हैं।

usort($data, function($a, $b) { 
    return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] 
}); 
संबंधित मुद्दे