2010-08-31 53 views
2

Considérez tableau suivantTrie un tableau associatif en php avec de multiples conditions

$details = array( 
array('lname'=>'A', 'fname'=>'P','membkey'=>700,'head'=>'y'), 
array('lname'=>'B', 'fname'=>'Q','membkey'=>540,'head'=>'n'), 
array('lname'=>'C', 'fname'=>'R','membkey'=>700,'head'=>'n'), 
array('lname'=>'D', 'fname'=>'S','membkey'=>540,'head'=>'y'), 
array('lname'=>'E', 'fname'=>'T','membkey'=>700,'head'=>'n') 
    ); 

Ici, je voudrais trier avec la tête et membkey. élément supérieur de même élément de membkey doit avoir 'la tête = y' et repris comme,

$details = array( 
array('lname'=>'A', 'fname'=>'P','membkey'=>700,'head'=>'y'), 
array('lname'=>'E', 'fname'=>'T','membkey'=>700,'head'=>'n'), 
array('lname'=>'C', 'fname'=>'R','membkey'=>700,'head'=>'n'), 
array('lname'=>'D', 'fname'=>'S','membkey'=>540,'head'=>'y'), 
array('lname'=>'B', 'fname'=>'Q','membkey'=>540,'head'=>'n') 
    ); 

Je l'ai essayé comme suit

function orderbymemberKey($a, $b){ 
    if ($a[membkey] == $b[membkey]) 
     return 0; 
    return($a[membkey] < $b[membkey])? -1 :1; 
} 
usort($details, orderbymemberKey); 
and it successfully order by membkey. 

Toutes les suggestions s'il vous plaît.

+0

vous devez être plus clair. ta question est un gâchis. –

+0

ajouté une fonction générique "sort_by" à ma réponse qui pourrait rendre les choses plus faciles pour vous –

Répondre

7

Vous êtes la moitié du chemin (si vous triez en arrière pour membkey en fonction de votre exemple):

function order_by_member_key($a, $b) 
{ 
    if ($a['membkey'] == $b['membkey']) 
    { 
    // membkey is the same, sort by head 
    if ($a['head'] == $b['head']) return 0; 
    return $a['head'] == 'y' ? -1 : 1; 
    } 

    // sort the higher membkey first: 
    return $a['membkey'] < $b['membkey'] ? 1 : -1; 
} 
usort($details, "order_by_member_key"); 
+0

Wow merci beaucoup! tout ce qu'il y a exactement ce dont j'avais besoin! – abhis

-1

laid, mais quelqu'un a écrit une fonction sur php.net: http://php.net/manual/en/function.sort.php

<?php 

$array[0]['name'] = 'Chris'; 
$array[0]['phone'] = '3971095'; 
$array[0]['year'] = '1978'; 
$array[0]['address'] = 'Street 1'; 

$array[1]['name'] = 'Breanne'; 
$array[1]['phone'] = '3766350'; 
$array[1]['year'] = '1990'; 
$array[1]['address'] = 'Street 2'; 

$array[2]['name'] = 'Dusty'; 
$array[2]['phone'] = '1541120'; 
$array[2]['year'] = '1982'; 
$array[2]['address'] = 'Street 3'; 

function multisort($array, $sort_by, $key1, $key2=NULL, $key3=NULL, $key4=NULL, $key5=NULL, $key6=NULL){ 
    // sort by ? 
    foreach ($array as $pos => $val) 
     $tmp_array[$pos] = $val[$sort_by]; 
    asort($tmp_array); 

    // display however you want 
    foreach ($tmp_array as $pos => $val){ 
     $return_array[$pos][$sort_by] = $array[$pos][$sort_by]; 
     $return_array[$pos][$key1] = $array[$pos][$key1]; 
     if (isset($key2)){ 
      $return_array[$pos][$key2] = $array[$pos][$key2]; 
      } 
     if (isset($key3)){ 
      $return_array[$pos][$key3] = $array[$pos][$key3]; 
      } 
     if (isset($key4)){ 
      $return_array[$pos][$key4] = $array[$pos][$key4]; 
      } 
     if (isset($key5)){ 
      $return_array[$pos][$key5] = $array[$pos][$key5]; 
      } 
     if (isset($key6)){ 
      $return_array[$pos][$key6] = $array[$pos][$key6]; 
      } 
     } 
    return $return_array; 
    } 

//usage (only enter the keys you want sorted): 

$sorted = multisort($array,'year','name','phone','address'); 
print_r($sorted); 

//output: 
Array ([0] => Array ([year] => 1978 [name] => Chris [phone] => 3971095 [address] => Street 1) [2] => Array ([year] => 1982 [name] => Dusty [phone] => 1541120 [address] => Street 3) [1] => Array ([year] => 1990 [name] => Breanne [phone] => 3766350 [address] => Street 2)) 
+0

Merci beaucoup ... – abhis

0

Est-ce que ce tableau est extrait d'une base de données? Parce que, si c'est le cas, vous devriez être en mesure d'utiliser les clauses ORDER BY pour le nettoyer en dehors de php.

+0

Merci pour votre contribution – abhis

0
<?php 

$membkey = array(); 
$head = array(); 
foreach ($details as $key => $row) { 
    $membkey[$key] = $row['membkey']; 
    $head[$key] = $row['head']; 
} 

array_multisort($membkey, SORT_DESC, $head, SORT_DESC, $details); 

print_r($details); 

Ou, encore plus une solution générique:

function sort_by($array) { 
    $arguments = func_get_args(); 
    $array = array_pop($arguments); 
    $variables = array(); 
    foreach ($arguments as $index => $key) { 
     $variables[] = '$arguments['.$index.']'; 
     if ($index % 2 == 0) { 
      $arguments[$index] = array(); 
      foreach ($array as $row) $arguments[$index][] = $row[$key]; 
     } 
    } 
    // call_user_func_array will not work in this case 
    eval('array_multisort('.implode(', ', $variables).', $array);'); 
    return $array; 
} 

print_r(sort_by('membkey', SORT_DESC, 'head', SORT_DESC, $details)); 
+0

Pourquoi n'utilisez-vous pas call_user_func() au lieu de eval()? Ce code peut exposer un trou de sécurité. – tamasd

+1

@Yorirou call_user_func_array ne fonctionne pas dans ce cas car array_multisort attend que le dernier argument soit une référence au tableau à trier –