2016-09-21 8 views
-1

У меня есть массив, который выглядит какСортировка массива на основе подсчета любого значения

Array 
(
    [0] => Array 
     (
      [id] => 39662 
      [points] => 24 
      [subject] => 112 
     ) 

    [1] => Array 
     (
      [id] => 39609 
      [points] => 24 
      [subject] => 87 
     ) 

    [2] => Array 
     (
      [id] => 39610 
      [points] => 23 
      [subject] => 77 
     ) 

    [3] => Array 
     (
      [id] => 39608 
      [points] => 23 
      [subject] => 87 
     ) 

    [4] => Array 
     (
      [id] => 39606 
      [points] => 22 
      [subject] => 60 
     ) 

    [5] => Array 
     (
      [id] => 39604 
      [points] => 19 
      [subject] => 75 
     ) 

    [6] => Array 
     (
      [id] => 39595 
      [points] => 18 
      [subject] => 60 
     ) 

    [7] => Array 
     (
      [id] => 39605 
      [points] => 18 
      [subject] => 47 
     ) 

    [8] => Array 
     (
      [id] => 39650 
      [points] => 17 
      [subject] => 87 
     ) 

    [9] => Array 
     (
      [id] => 39660 
      [points] => 17 
      [subject] => 55 
     ) 

) 

Теперь я хочу, чтобы отсортировать затем на основе подсчета ключевых субъекта. Вы можете видеть, что subjuet = 87 имеет 3 записи, а subject = 60 имеет две записи, поэтому все три записи из 87 должны отображаться первыми, после этих записей - 60, затем другие.

Я попробовал array_multisort, но не дал ожидаемого результата.

Благодаря

+1

Дайте код, который вы пытались помочь вам – Sasikumar

+1

я попробовал код на http://stackoverflow.com/questions/7433569/php -sort-a-multipim-array-by-number-of-items. И array_multisort, и usort. – Rich5757

+0

https://en.wikipedia.org/wiki/Insertion_sort – SaidbakR

ответ

0

Попробуйте следующий метод для случая

$data[] = array('points' => 67, 'subject' => 2); 
$data[] = array('points' => 86, 'subject' => 1); 
$data[] = array('points' => 85, 'subject' => 6); 
$data[] = array('points' => 98, 'subject' => 2); 
$data[] = array('points' => 86, 'subject' => 6); 
$data[] = array('points' => 67, 'subject' => 7); 


// Obtain a list of columns 
foreach ($data as $key => $row) { 
    $subject[$key] = $row['subject']; 
} 

// Sort the data with volume descending, edition ascending 
// Add $data as the last parameter, to sort by the common key 
array_multisort($subject, SORT_DESC, $data); 

Пример использования с моим массивом из руководства PHP.

Выход из вышеперечисленного был

Array 
(
    [0] => Array 
     (
      [points] => 67 
      [subject] => 7 
     ) 

    [1] => Array 
     (
      [points] => 85 
      [subject] => 6 
     ) 

    [2] => Array 
     (
      [points] => 86 
      [subject] => 6 
     ) 

    [3] => Array 
     (
      [points] => 67 
      [subject] => 2 
     ) 

    [4] => Array 
     (
      [points] => 98 
      [subject] => 2 
     ) 

    [5] => Array 
     (
      [points] => 86 
      [subject] => 1 
     ) 

) 
+0

В вашем примере, потому что subject = 6 имеет две записи, поэтому эти записи должны отображаться сверху. – Rich5757

1

В соответствии с нужной продукции, вам просто нужно array_map() с array_multisort(),

Пример:

<?php 
// Test Array 
$array = array(
    array('id'=>39662,'points'=>'24','subject'=>112), 
    array('id'=>39609,'points'=>'24','subject'=>87), 
    array('id'=>39610,'points'=>'23','subject'=>77), 
    array('id'=>39608,'points'=>'23','subject'=>87), 
    array('id'=>39606,'points'=>'22','subject'=>60), 
    array('id'=>39604,'points'=>'19','subject'=>75), 
    array('id'=>39595,'points'=>'18','subject'=>60), 
    array('id'=>39605,'points'=>'18','subject'=>47), 
    array('id'=>39650,'points'=>'17','subject'=>87), 
    array('id'=>39660,'points'=>'17','subject'=>55), 
); 

$newArr = array(); // initialize the new Array 
foreach ($array as $key => $value) 
{ 
    $newArr[$value['subject']][] = $value; 
} 

array_multisort(array_map('count', $newArr), SORT_DESC, $newArr); // using array_multisort() and Sort as DESC order by using array_map() 

echo "<pre>"; 
print_r($newArr); 
?> 

Результат:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [id] => 39609 
        [points] => 24 
        [subject] => 87 
       ) 

      [1] => Array 
       (
        [id] => 39608 
        [points] => 23 
        [subject] => 87 
       ) 

      [2] => Array 
       (
        [id] => 39650 
        [points] => 17 
        [subject] => 87 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [id] => 39606 
        [points] => 22 
        [subject] => 60 
       ) 

      [1] => Array 
       (
        [id] => 39595 
        [points] => 18 
        [subject] => 60 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [id] => 39604 
        [points] => 19 
        [subject] => 75 
       ) 

     ) 

    [3] => Array 
     (
      [0] => Array 
       (
        [id] => 39605 
        [points] => 18 
        [subject] => 47 
       ) 

     ) 

    [4] => Array 
     (
      [0] => Array 
       (
        [id] => 39610 
        [points] => 23 
        [subject] => 77 
       ) 

     ) 

    [5] => Array 
     (
      [0] => Array 
       (
        [id] => 39660 
        [points] => 17 
        [subject] => 55 
       ) 

     ) 

    [6] => Array 
     (
      [0] => Array 
       (
        [id] => 39662 
        [points] => 24 
        [subject] => 112 
       ) 

     ) 

) 
+0

Спасибо @devpro, В приведенном выше мне просто не нужен вложенный массив. Элементы должны перестраиваться в соответствии с подсчетом. – Rich5757

+0

@ Rich5757: его перегруппировка – devpro

0
function array_sort($array, $key){ 

    $new_array = array(); 
    $sortable_array = array(); 

    if (count($array) > 0) { 
     foreach ($array as $k => $v) { 
      if (is_array($v)) { 
       foreach ($v as $k2 => $v2) { 

        if ($k2 == $key) { 
         $sortable_array[$k] = $v2; 
        } 
       } 
      } else { 
       $sortable_array[$k] = $v; 
      } 
     } 


     asort($sortable_array); 


     } 

     foreach ($sortable_array as $k => $v) { 
      $new_array[$k] = $array[$k]; 
     } 
    } 

    return $new_array; 
} 
array_sort($a, 'subjects'); 

// $ а массив, который необходимо отсортировать

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