2014-09-16 2 views
0

Есть ли способ сортировать этот массив по определенному ключу в порядке убывания или возрастания?Сортировка одного массива на ключ в desc или asc

<?php 
$array = array(
    "samaccountname" => "Mark", => "age" => "26", 
    "samaccountname" => "John", => "age" => "50", 
    "samaccountname" => "Peter", => "age" => "31", 
    "samaccountname" => "Dennis", "age" => "21" 
); 
?> 

Что-то вроде:

ksort($array,'samaccountname','SORT_DESC'); 
+1

'usort' .......... – zerkms

+1

В других новостях, ваше определение массива нарушается, вы не можете иметь несколько' => 'операторы в ключевом определении одного массива – Joe

ответ

0

Вы можете использовать usort написать пользовательскую функцию сортировки. Таким образом, вы можете сортировать по определенному ключу подмассивов массива для сортировки. Вы даже можете обернуть это в своей собственной функции:

<?php 
// Fixed syntax of your nested array: 
$array = array(
    array("samaccountname" => "Mark", "age" => "26"), 
    array("samaccountname" => "John", "age" => "50"), 
    array("samaccountname" => "Peter", "age" => "31"), 
    array("samaccountname" => "Dennis", "age" => "21") 
); 

/** 
* Sorts a nested array by the value of the specified key. Can sort ascending or descending */ 
*/ 
function myksort(&$array, $subkey, $sort = SORT_ASC) 
{ 
    return usort($array, 
     // The callback function. Make sure it can use $subkey and $sort. 
     function($a, $b) use ($subkey, $sort) { 
      // Compare the items respecting the sort. 
      if ($sort == SORT_DESC) 
       return strcmp($b[$subkey], $a[$subkey]); 
      else 
       return strcmp($a[$subkey], $b[$subkey]); 
     }); 
} 

// Sort the array by 'samaccountname' 
myksort($array, 'samaccountname'); 

// Show the results. 
var_dump($array); 

// Sort the array by 'samaccountname', but descending. 
myksort($array, 'samaccountname', SORT_DESC); 

// Show the results. 
var_dump($array); 

Функция сравнения сама может быть короче, а также, если вы пишете это так, но я думаю, что if..else немного более удобным для чтения.

return strcmp($a[$subkey], $b[$subkey]) * ($sort == SORT_DESC?-1,1); 
+1

Спасибо, это работает как шарм! Просто то, что я искал. –

0

Вы можете использовать array_multisort() для такого рода вещи. Поскольку array_multisort() требует массив столбцов, вам нужно создать еще одну структуру данных для сортировки. См. Пример № 3 в документации PHP по адресу array_multisort().

$myarr = array(
    array("samaccountname" => "Mark", "age" => "26"), 
    array("samaccountname" => "John", "age" => "50"), 
    array("samaccountname" => "Peter", "age" => "31"), 
    array("samaccountname" => "Dennis", "age" => "21")); 

foreach ($myarr as $key => $row) { 
     $samaccountname[$key] = $row['samaccountname']; 
     $age[$key] = $row['age']; 
} 

array_multisort($samaccountname, SORT_DESC, $myarr); 
var_dump($myarr); 
+0

Thanks, это работает! –