2014-01-20 3 views
0

Я нарушал следующую проблему.PHP: как отсортировать массив по значению сначала, а затем по ключу

Я получил этот массив:

[596] => 2 
[9] => 2 
[358] => 2 
[1579] => 1 
[156] => 1 
[576] => 1 
[535] => 1 

Как вы можете видеть, значения упорядочены по убыванию пути, но ключи случайным образом. Я бы хотел, чтобы ключи были отсортированы DESC, хотя. Я играл с array_multisort, но я не смог решить проблему с ним. Первой проблемой, с которой я столкнулся, был тот факт, что array_multisort перепроверяет числовые ключи. Я изменил ключи на нечисловой вариант, а именно k596 и т. Д. Это помогло мне сортировать ключи, но не так, как хотелось бы.

[k9] => 2 
[k596] => 2 
[k358] => 2 
[k576] => 1 
[k535] => 1 
[k1579] => 1 
[k156] => 1 

Результат, который я хотел бы видеть в конце концов:

[k596] => 2 
[k358] => 2 
[k9] => 2 
[k1579] => 1 
[k576] => 1 
[k535] => 1 
[k156] => 1 

ли кто-нибудь может помочь мне здесь? Должен быть простой способ сделать это, правильно?

ответ

1

Хорошо, этот вопрос немного сложнее, чем я думал! Дан массив $arry = array('a'=>'hilbert', 'b'=>'noether', 'c'=>'landau');

Я бы генерировать второй массив, содержащий кортежи, как это:

$brry = array(); 
foreach($arry as $key => $value){ 
    $brry[] = array($key,$value); 
} 

//Now $brry looks like: 
//$brry: 
// [0] => array('a','hilbert'); 
// [1] => array('b','noether'); 
// [2] => array('c','landau'); 

//now you can easily sort it! 
usort($brry, "cmp"); 

//And then transform it back to the array structure you have before 
foreach($brry as $value){ 
    $crry[$value[0]] = $value[1]; 
} 

//with this sorting function cmp: 
function cmp($first, $second){ 
    if(strcmp($first[1], $second[1]) != 0){ 
     return strcmp($first[1], $second[1]); 
    } 
    else{ 
     return strcmp($first[0], $second[0]); 
    } 
} 

функция cmp сортирует строки теперь так strcmp("192","20") > 0 в то время как это не может быть верно для целых чисел!

1
uksort($array, function ($a, $b) use ($array) { 
    if ($array[$a] != $array[$b]) { 
     return $array[$a] - $array[$b]; 
    } 
    return $a - $b; 
}); 

Вставьте соответствующие операции сравнения, используя здесь просто -. Это несколько сложнее, если вы зависите от PHP < 5.3 и не имеете анонимных функций.

+0

Странно, я попробовал аналогичный подход, но использовал '$ array' как глобальный и в итоге появился предупреждение« Array был изменен »; это, похоже, работает. –

+0

вместо возврата $ a - $ b; 'return $ a> $ b;', а затем '$ array = array_reverse ($ array, TRUE);' –

+0

@Nouphal Это неправильно. Вам нужно вернуть значение < 0, 0 or > 0, а не булевое. – deceze

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