2014-11-22 4 views
-1

У меня есть массив $arrayСортировка ассоциативный массив

$array => 
(
    ['name'] => (
       "Ronaldo","Ribery","Bale","Messi" 
       ), 
    ['rank'] => (
       2,4,1,3 
      ) 
) 

Теперь Как я могу отсортировать массив DESC используя rank поле наряду с ожидаемым выходом name ->

$array => 
(
    ['name'] => (
       "Ribery","Messi","Ronaldo","Bale" 
       ), 
    ['rank'] => (
       4,3,2,1 
      ) 
) 

ответ

2

Допустимое использование для oft-misunderstood array_multisort()

<?php 
$array = [ 
    'name' => ["Ronaldo","Ribery","Bale","Messi"], 
    'rank' => [2,4,1,3] 
]; 
array_multisort(
    $array['rank'], SORT_DESC, SORT_NUMERIC, 
    $array['name'], SORT_ASC, SORT_STRING 
); 
var_dump($array); 

array(2) { 
    'name' => 
    array(4) { 
    [0] => 
    string(6) "Ribery" 
    [1] => 
    string(5) "Messi" 
    [2] =>                                        
    string(7) "Ronaldo"                                    
    [3] =>                                        
    string(4) "Bale"                                     
    }                                         
    'rank' => 
    array(4) { 
    [0] => 
    int(4) 
    [1] => 
    int(3) 
    [2] => 
    int(2) 
    [3] => 
    int(1) 
    } 
} 
1

Заканчивать этот php article также, если вы хотите, чтобы ваши два массива, чтобы иметь отношение, чем вы могли бы лучше написать это так:

array(
    array(
     name => 'Messi', 
     rank => 4, 
    ), 
    etc.. 
); 
0

Почему бы не изменить структуру данных, чтобы иметь возможность работать с объектами?

class Player { 
    public $name; // would be better as private and add getters 
    public $rank; 

    public function __construct($name, $rank) { 
     $this->name = $name; 
     $this->rank = $rank; 
    } 
} 

Затем заполнить ваш массив (я не знаком с футболом):

$players = [ // or array(...) if you are using older PHP 
    new Player('Foo', 3), 
    new Player('Bar', 1), 
    new Player('FooBar', 2) 
]; 

Затем вы можете использовать обычный вид:

// or a function name, if using older PHP 
usort($players, function (Player $a, Player $b) { 
    if ($a->rank == $b->rank) { 
     return 0; 
    } 
    return ($a->rank < $b->rank) ? -1 : 1; 
}); 
Смежные вопросы