2011-07-18 256 views
2

我具有以下陣列排序陣列中的特定順序

Array 
(
[0] => Array 
    (
     [label] => Germany 
     [conversions] => 1 
    ) 

[1] => Array 
    (
     [label] => United States 
     [conversions] => 8 
    ) 

[2] => Array 
    (
     [label] => France 
     [conversions] => 1 
    ) 

[3] => Array 
    (
     [label] => China 
     [conversions] => 1 
    ) 

[4] => Array 
    (
     [label] => Philippines 
     [conversions] => 1 
    ) 

[5] => Array 
    (
     [label] => Turkey 
     [conversions] => 1 
    ) 

我想訂購以下數組,首先通過轉換(降序),則通過標籤(ASC)

輸出將有以下順序:

United States 
China 
France 
Germany 
Philippines 
Turkey 
+2

上usort http://php.net外觀/manual/en/function.usort.php –

回答

0

試試這個

$myArray="your array"; 

<?php 

foreach($myArray as $c=>$key) { 
    $sort_conv[$c] = $key['conversions']; 
    $sort_lable[$c] = $key['label']; 
    } 

array_multisort($sort_conv, SORT_ASC, $sort_lable, SORT_STRING, $myArray); 
print_r($myArray); 
?> 
0

請嘗試以下操作:(未測試它,來源:PHP Example #3

foreach ($data as $key => $row) { 
    $label[$key] = $row['label']; 
    $conversion[$key] = $row['conversion']; 
} 

array_multisort($conversion, SORT_DESC, $label, SORT_ASC, $data); 
+0

編輯:在$ data之前缺少冒號 – hakre

4

如果使用> = PHP 5.3 ...

usort($arr, function($a, $b) { 

    $diff = $b['conversions'] - $a['conversions']; 

    if (! $diff) { 
     return strcmp($a['label'], $b['label']); 
    } 

    return $diff; 

}); 

這是比較簡單的,以使其與< PHP 5.3的工作。

+0

第二個轉換索引中的錯字。 –

+0

@CoreXii:已經在它之上:) – alex

+1

請注意,函數只能在PHP 5.3及以上版本中以這種方式定義。如果您使用的是舊版本的PHP,則需要以傳統方式定義您的函數,並且第二個參數'usort()'將成爲函數名稱。 (無論如何,如果您打算在多個地方使用相同的排序功能,您可能會這樣做) – Spudley

1

您需要使用PHP的usort()函數。這使您可以編寫一個確定排序順序的函數,以便您可以按照您喜歡的任何順序排序。

該函數將被usort()算法重複調用,並且會給出兩個參數,它們是在任何給定時刻要排序的數組的兩個元素。如果這兩個元素中的第一個更大,你的函數應該返回-1,如果第二個更大,則函數應該返回-1;如果爲了排序目的而將它們視爲相同,則返回0。

更多的信息和例子參見PHP手冊頁:http://php.net/manual/en/function.usort.php

0

您可以使用usort提供自己的排序功能

usort($a, function($x, $y) { 
    return $y["conversions"] < $x["conversions"] ? 1 : 
    ($x["conversions"] < $y["conversions"] ? -1 : 
     strcmp($x["label"], $y["label"])) 
    ); 
}); 
1

我的首選array_multisortPHP Manual我的答案在下面,你可以用參數指定排序順序。

除了靈活性,它應該比使用usort更快,它存在的問題是它沒有真正爲排序順序進行參數化,所以也沒有重新發明輪子。

更舒適,把它包裝成一個函數指定鍵作爲字符串(Demo):

$sorted = $multisortByKey($array, 'conversions', SORT_DESC, 'label', SORT_ASC); 

爲:

$array = array(
    0 => array(
    'label' => 'Germany', 
    'conversions' => 1, 
), 
    1 => array(
    'label' => 'United States', 
    'conversions' => 8, 
), 
    2 => array(
    'label' => 'France', 
    'conversions' => 1, 
), 
    3 => array(
    'label' => 'China', 
    'conversions' => 1, 
), 
    4 => array(
    'label' => 'Philippines', 
    'conversions' => 1, 
), 
    5 => array(
    'label' => 'Turkey', 
    'conversions' => 1, 
), 
); 

$multisortByKey = function(array $a) { 
    $args = func_get_args(); 
    $a = array_shift($args); 
    $extract = function($k) use($a) {return array_map(function($v) use($k) { return $v[$k]; }, $a); }; 
    # NOTE: The following check/for-loop is not entirely correct 
    # as multiple sort parameters per entry are allowed. I leave this 
    # for practice. 
    $c = count($args); 
    if(!$c%2) throw new InvalidArgumentException('Parameter count mismatch'); 
    for($i=0;$i<$c;$i+=2) 
     $args[$i] = $extract($args[$i]); 
    $args[] = &$a; 
    call_user_func_array('array_multisort', $args); 
    return $a; 
}; 

$sorted = $multisortByKey($array, 'conversions', SORT_DESC, 'label', SORT_ASC); 

var_dump($sorted);