Сортировка многомерных массивов по размеру элемента - PullRequest
2 голосов
/ 28 октября 2010

Я хотел бы иметь возможность отсортировать этот массив по размеру массива элемента;

array( 
    [0] =>  array( [0] => 'B',  [1] => 'C');
    [1] =>  array( [0] => 'B');
    [2] =>  array( [0] => 'A', [1] =>  'C');
    [3] =>  array( [0] => 'A', [1] =>  'B', [2] =>  'C');
    [4] =>  array( [0] => 'C');       
    [5] =>  array( [0] => 'A');
    [6] =>  array( [0] => 'A', [1] =>  'B');
   )

array( 
    [0] =>  array( [0] => 'A');
    [1] =>  array( [0] => 'B');
    [2] =>  array( [0] => 'C');
    [3] =>  array( [0] => 'A', [1] =>  'B');
    [4] =>  array( [0] => 'A', [1] =>  'C');
    [5] =>  array( [0] => 'B',  [1] => 'C');
    [6] =>  array( [0] => 'A', [1] =>  'B', [2] =>  'C');
)

Ответы [ 3 ]

4 голосов
/ 28 октября 2010

Использование замыканий (PHP 5.3):

usort($array, function($a, $b) { return count($a) - count($b); });

Без использования замыканий (PHP 5.2):

usort($array, create_function('$a, $b', 'return count($a) - count($b)'));

Обратите внимание, что $array будет отсортировано по месту. Не ищите его в возвращаемом значении usort().

2 голосов
/ 28 октября 2010

Я не проверял это, но я надеюсь, вы можете получить точку.

function yoursort($a,$b) {
  if(!(is_array($a) && is_array($b)) return 0; // item of array is not an array
  $cntA = sizeof($a);
  $cntB = sizeof($b);
  if($cntA!=$cntB) return $cntA-$cntB; // smaller array up
  foreach($a as $key=>$val) {
    $ordA = ord($a[$key]);
    $ordB = ord($b[$key]);
    if($ordA!=$ordB) return $ordA-$ordB; // sort sub array by alphabet
  }
  return 0; // items are equal
}
usort($yourarray,"yoursourt");

Здесь вы можете найти больше о usort http://php.net/manual/en/function.usort.php

1 голос
/ 28 октября 2010

Вы можете сделать это в 2 шага.

  • На шаге 1 сортируйте отдельные массивы по значению.
  • На шаге 2 сортируйте двумерный массив, сначала по размеру иесли размер не равен сортировке по значениям.

Код:

foreach($input as $key => $val) {
        sort($input[$key]);
}
usort($input, "cmp");
print_r($input);

function cmp($a,$b) {
        if(count($a) != count($b)) {
                return count($a) - count($b);
        }
        for($i=0;$i<count($a);$i++) {
                if($a[$i] != $b[$i]) {
                        return strcmp($a[$i],$b[$i]);
                }
        }
        return 0;
}

Код в действии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...