2014-01-30 4 views
1

Я хочу заказать массив, но не в алфавитном порядке, у меня есть это:Как заказать массив не алфавитной PHP

Array(
'D' => 40 
'S' => 60 
'C' => 50 
'I' => 60 
) 

И это должно быть порядка по убыванию значения:

Array(
'S' => 60 
'I' => 60 
'C' => 50 
'D' => 40 
) 

но если есть повторяющиеся значения, то порядок должен быть D > I > S > C:

Array(
'I' => 60 
'S' => 60 
'C' => 50 
'D' => 40 
) 

Любые идеи?

+0

'но если есть повторяющиеся значения , то порядок должен быть как D> I> S> C: 'непонятно –

+0

@ user007 алфавит указывает, что C перед S, но в моем случае буквы должны следовать этому порядку .. (сначала) D - I - S - C (последний) – Lumilo

+0

Всегда ли в этом массиве всего 4 ключа? –

ответ

0
$array = array( 
    'C'=>60, 
    'S'=>10, 
    'I'=>20, 
    'D'=>60 
); 

arsort($array); //sorts in descending order 

$unique = array_unique($array,SORT_REGULAR); //get unique values - returns 60,20,10 

$finalarray = array(); 
$order = array('D','I','S','C'); //defining the sort order priority 
foreach($unique as $val){ 

    $key = array_keys($array, $val); //get all keys that have the similar value (for duplicates) 
     foreach($order as $val2){ 
      if(in_array($val2,$key)){ //check key according to order of priority keys 
       $finalarray[$val2] = $array[$val2]; 
      } 

     } 

} 

var_dump($finalarray); 

Fiddle here.

+0

Yeees !!! Большое спасибо!! – Lumilo

1

Вы можете использовать функцию asort()

Он сортирует массив поддерживания индекса ассоциации.

$arr = array('I' => 60, 'S' => 60, 'C' => 50, 'D' => 40); 
asort($arr); 

Но вы не должны ожидать определенный порядок сортировки для равных значений, потому что, если какой-либо из функций сортировки оценивает два члена как равны, то порядок не определен (сортировка не стабильна).

можно реализовать сортировку как по значению и ключом пути создания 2 добавочных массивов для ключей и значений, а затем с помощью array_multisort функции:

$arr = array(
    'I' => 60, 
    'S' => 60, 
    'C' => 50, 
    'D' => 40 
); 

$tag = array(); 
$num = array(); 

foreach($arr as $key => $value){ 
    $tag[] = $key; 
    $num[] = $value; 
} 

array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arr); 

var_dump($arr); 

/* result of var_dump($arr): 
array (size=4) 
    'I' => int 60 
    'S' => int 60 
    'C' => int 50 
    'D' => int 40 
*/ 
+0

Спасибо за ваш ответ, но большая проблема в том, когда два или более членов равны, я должен сделать это следующим образом: D> I> S> C -.- – Lumilo

+0

@ user3252775 Обновлено! – zavg

+0

Спасибо, zavg, это решение разрешило пример, который я предложил, потому что повторяющиеся буквы могут быть отсортированы в алфавитном порядке, но если массив: D => 40, I => 50, S => 60, C => 60 не работает ... пожалуйста, помогите мне :( – Lumilo

Смежные вопросы