упорядочение массива в определенном порядке - PullRequest
2 голосов
/ 18 июля 2011

У меня следующий массив

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
    )

)

Я хочу заказать следующий массив, сначала по преобразованиям (desc), затем по метке (asc)

outputбудет иметь следующую последовательность:

United States
China
France
Germany
Philippines
Turkey

Ответы [ 6 ]

4 голосов
/ 18 июля 2011

При использовании> = PHP 5.3 ...

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

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

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

   return $diff; 

});

Относительно просто заставить его работать с

1 голос
/ 18 июля 2011

Я предпочел array_multisort Руководство по PHP в моем ответе ниже, поскольку вы можете указать порядок сортировки с параметрами.

Помимо гибкости, это должно быть быстрее, чем использование usort, из-за чего возникает проблема, заключающаяся в том, что он не параметризован для порядка сортировки, поэтому не нужно заново изобретать колесо.

Для большего удобства оберните его в функцию, определяющую клавиши как строки ( Демонстрация ):

$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);
1 голос
/ 18 июля 2011

Вам необходимо использовать функцию PHP usort().Это позволяет вам написать функцию, которая определяет порядок сортировки, так что вы можете сортировать вещи в любом порядке.

Функция будет вызываться неоднократно алгоритмом usort() и даст вам два параметра,будучи двумя элементами массива, который он хочет отсортировать в любой момент.Ваша функция должна возвращать -1, если первый из этих двух элементов больше, +1, если второй, больше, и ноль, если они считаются одинаковыми для целей сортировки.

См.Страница руководства PHP для получения дополнительной информации и примеров: http://php.net/manual/en/function.usort.php

0 голосов
/ 18 июля 2011

попробуйте

$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 голосов
/ 18 июля 2011

Вы можете использовать usort для предоставления собственной функции сортировки

usort($a, function($x, $y) {
  return $y["conversions"] < $x["conversions"] ? 1 :
    ($x["conversions"] < $y["conversions"] ? -1 :
      strcmp($x["label"], $y["label"]))
    );
});
0 голосов
/ 18 июля 2011

Попробуйте следующее: (не проверял, источник: Пример PHP # 3 )

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

array_multisort($conversion, SORT_DESC, $label, SORT_ASC, $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...