2010-08-31 96 views
2

考慮以下數組排序關聯數組在PHP中有多個條件

$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') 
    ); 

在這裏我想用頭和membkey進行排序。同樣membkey元素的頂級元素應該有「頭= Y」和作爲呼應,

$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') 
    ); 

我嘗試瞭如下

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. 

任何建議,請。

+0

你需要更加清晰。你的問題是一團糟。 – 2010-08-31 05:03:49

+0

爲我的答案增加了一個通用的「sort_by」函數,可以讓你更容易 – 2010-08-31 07:17:53

回答

7

你有一半(儘管你是向後的membkey根據您的示例排序):

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

非常感謝你!一切都正是我需要的! – abhis 2010-08-31 05:14:30

-1

醜,但有人在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

非常感謝... – abhis 2010-08-31 05:22:13

0

這個數組是從數據庫中提取的嗎?因爲,如果是這樣,你應該能夠使用ORDER BY子句在PHP之外進行清理。

+0

感謝您的貢獻 – abhis 2010-08-31 05:17:09

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); 

或者,一個更通用的解決方案:

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

爲什麼不使用call_user_func()而不是eval()?這段代碼可能會暴露一個安全漏洞。 – tamasd 2010-08-31 07:23:44

+1

@Yorirou call_user_func_array在這種情況下不起作用,因爲array_multisort期望最後一個參數是對數組的引用進行排序 – 2010-08-31 22:35:30