2010-08-11 3 views
3

У меня есть массив чисел, например myarray = (45,3,56,7,21). То, что мне нужно сделать, - это ранжировать значения в другом массиве, поэтому для вышеизложенного я бы закончил с myarray2 = (4,1,5,2,3).Как присвоить номер ранга массиву

Большое спасибо,

Адам

+0

Может ли кто-нибудь посоветовать, как вы решите эту проблему, но ранжируйте массив в порядке убывания? – ajcw

ответ

2

Там вы идете, комплексное решение:

<?php 

$myarray = array(45,3,56,7,21); 

//create a copy and sort 
$myarray_copy = $myarray; 
sort($myarray_copy); 

//reverses key and values 
$myarray_copy = array_flip($myarray_copy); 

//create result by using keys from sorted values + 1 
foreach($myarray as $val) 
    $myarray2[] = $myarray_copy[$val]+1; 

//print final array 
print_r($myarray2); 

/* 
Output: 

Array ([0] => 4 [1] => 1 [2] => 5 [3] => 2 [4] => 3) 
*/ 
?> 
0

Возьмите номер вашего массива, подсчитать, сколько чисел меньше, чем один, добавьте один и у вас есть ранг.

1

Очень интересно.

Что я могу придумать на месте что-то вроде этого:

Сортировка массива и поместить это в другой массив, а затем заполнить myarray2 путем поиска промежуточного массива для значения, а затем заполнение myarray2 годов значения с индексом.

$myarraytemp = sort clone $myarray; 

foreach ($myarray as $num) 
{ 
    array_push($myarray2, array_search($num,$myarraytemp)); 
} 

В качестве альтернативы вы можете сделать это:

foreach ($myarray as $num) 
{ 
    $rank=0; 
    foreach ($myarray as $innernum) 
    { 
     if($innernum<= $num) 
      $rank++;    
    } 
    array_push($myarray2, $rank); 
} 
+0

Если вы заметили какие-либо незначительные синтаксические ошибки здесь, пожалуйста, дайте мне знать, делайте много perl в последнее время, поэтому некоторые синтаксисы perl могут случайно попадать в мой php. –

0

Вот функция, чтобы сделать это:

function get_array_ranking($array){ 
    $ranking = array(); 
    foreach ($array as $number) { 
    $smaller = 1; 
    foreach ($array as $number2) { 
     if ($number2 < $number) $smaller++; 
    } 
    $ranking[] = $smaller; 
    } 
    return $ranking; 
} 
1

Ну, вы могли бы сделать что-то вроде:

$b = $a = array(45,3,56,7,21); 
sort($b); 
$r = array_map(
    function ($number) use ($b) { 
     return array_search($number, $b) + 1; 
    }, $a); 

Но чтобы сделать его эффективным, вы должны реализовать свой o wn. Вот реализация Java я не мог удосужился перевести (из weka):

/** 
* Sorts a given array of integers in ascending order and returns an 
* array of integers with the positions of the elements of the original 
* array in the sorted array. The sort is stable. (Equal elements remain 
* in their original order.) 
* 
* @param array this array is not changed by the method! 
* @return an array of integers with the positions in the sorted 
* array. 
*/ 
public static int[] sort(int[] array) { 

    int[] index = new int[array.length]; 
    int[] newIndex = new int[array.length]; 
    int[] helpIndex; 
    int numEqual; 

    for (int i = 0; i < index.length; i++) { 
     index[i] = i; 
    } 
    quickSort(array, index, 0, array.length - 1); 

    // Make sort stable 
    int i = 0; 
    while (i < index.length) { 
     numEqual = 1; 
     for (int j = i + 1; ((j < index.length) 
       && (array[index[i]] == array[index[j]])); 
       j++) { 
      numEqual++; 
     } 
     if (numEqual > 1) { 
      helpIndex = new int[numEqual]; 
      for (int j = 0; j < numEqual; j++) { 
       helpIndex[j] = i + j; 
      } 
      quickSort(index, helpIndex, 0, numEqual - 1); 
      for (int j = 0; j < numEqual; j++) { 
       newIndex[i + j] = index[helpIndex[j]]; 
      } 
      i += numEqual; 
     } else { 
      newIndex[i] = index[i]; 
      i++; 
     } 
    } 
    return newIndex; 
} 

private static void quickSort(int[] array, int[] index, 
     int left, int right) { 

    if (left < right) { 
     int middle = partition(array, index, left, right); 
     quickSort(array, index, left, middle); 
     quickSort(array, index, middle + 1, right); 
    } 
} 
0

Довольно просто, если вы используете функцию сортировки, которая поддерживает оригинальные ключи, как asort:

Кроме того, так как это использует внутреннее сортировка PHP, время выполнения для сортировки п журнал (п) Я считаю

$myArray = (45,3,56,7,21); 
$myArrayCopy = $myArray; 
//asort will sort an array while preserving the key value 
asort($myArrayCopy); 

foreach($myArraycopy as $key => $value) 
{ 
    //map the keys of the array to the original index locations 
    $sortIndexArray[] = $key; 
} 
Смежные вопросы