2012-02-13 12 views
22

क्या बहु-आयामी सरणी में एकाधिक फ़ील्ड को सॉर्ट करने के लिए usort का उपयोग करना संभव है? उदाहरण के लिए मैं name को वर्णानुक्रम से क्रमबद्ध करना चाहता हूं और फिर उन अभिलेखों से मैं उन्हें age द्वारा सॉर्ट करना चाहता हूं। क्या यह sort का उपयोग कर संभव है?PHP usort कई क्षेत्रों को सॉर्ट करना

Array ([0] => Array 
       ([name] => Jonah 
       [age] => 27) 
     [1] => Array 
       ([name] => Bianca 
       [age] => 32) 
    ) 
+0

संभव डुप्लिकेट [एकाधिक कुंजी द्वारा क्रमबद्ध बहुआयामी सरणी] (http://stackoverflow.com/questions/3232965/sort-multidimensional-array-by-multiple-keys) – salathe

उत्तर

26
usort($arr, function($a, $b) 
{ 
    $name = strcmp($a['name'], $b['name']); 
    if($name === 0) 
    { 
     return $a['age'] - $b['age']; 
    } 
    return $name; 
}); 
+0

जिज्ञासा से, अगर मैं 'name' को सॉर्ट कर रहा था लेकिन यह इसके बजाय एक पूर्णांक था (उदाहरण के लिए), 'strcmp' का उपयोग करने के बजाय आप किस फ़ंक्शन का उपयोग करने की अनुशंसा करेंगे? – user1205775

+0

@ user1205775: सरल अंकगणितीय ऑपरेटरों का उपयोग करना ठीक काम करेगा। –

55

कैसे के बारे में:

$arr = Array (
    0 => Array (
     'name' => 'Jonah', 
     'age' => '27', 
    ), 
    1 => Array (
     'name' => 'Bianca', 
     'age' => '32', 
    ), 
    2 => Array (
     'name' => 'Jonah', 
     'age' => '25', 
    ), 
    3 => Array (
     'name' => 'Bianca', 
     'age' => '35', 
    ), 
); 
function comp($a, $b) { 
    if ($a['name'] == $b['name']) { 
     return $a['age'] - $b['age']; 
    } 
    return strcmp($a['name'], $b['name']); 
} 

usort($arr, 'comp'); 
print_r($arr); 

उत्पादन:

Array 
(
    [0] => Array 
     (
      [name] => Bianca 
      [age] => 32 
     ) 

    [1] => Array 
     (
      [name] => Bianca 
      [age] => 35 
     ) 

    [2] => Array 
     (
      [name] => Jonah 
      [age] => 25 
     ) 

    [3] => Array 
     (
      [name] => Jonah 
      [age] => 27 
     ) 

) 
5

कैसे के बारे में:

<?php 

function getRandomName() { 
     $possible = "ab"; 
     $possible_len = strlen($possible); 
     $r = ''; 
     for ($i = 0; $i < 4; $i++) { 
       $r .= substr($possible, mt_rand(0, $possible_len-1), 1); 
     } 
     return ucfirst($r); 
} 

$a = array(); 
for ($i = 0; $i < 10; $i++) { 
     $a[] = array('name' => getRandomName(), 'age' => rand(1,10), 'start_order' => $i); 
} 
$order = array('name' => 'desc', 'age' => 'asc'); 

print_r($a); 

usort($a, function ($a, $b) use ($order) { 
     $t = array(true => -1, false => 1); 
     $r = true; 
     $k = 1; 
     foreach ($order as $key => $value) { 
       $k = ($value === 'asc') ? 1 : -1; 
       $r = ($a[$key] < $b[$key]); 
         if ($a[$key] !== $b[$key]) { 
           return $t[$r] * $k; 
         } 

     } 
     return $t[$r] * $k; 
}); 

print_r($a); 
संबंधित मुद्दे