2013-02-27 2 views
-1

Я могу только представить, что это довольно просто, и все же решение ускользает от меня.Сортировка некоторых строк?

Пусть Предположим, у меня есть следующие переменные:

$group1 = "5"; 
$group2 = "1"; 
$group3 = "15"; 
$group4 = "3"; 
$group5 = "7"; 
$group6 = "1"; 
$group7 = "55"; 
$group8 = "0"; 
$group9 = "35"; 

Я хочу группы, перечисленные с наибольшим количеством первого, например:

Group 7 is number 1 with 55. 
Group 9 is number 2 with 35. 
Group 3 is number 3 with 15. 
Group 5 is number 4 with 7. 
Group 1 is number 5 with 5. 
Group 4 is number 6 with 3. 
Group 2 is number 7 with 1. 
Group 6 is number 8 with 1. 
Group 8 is number 9 with 0. 

Возможно, было бы проще перечислить все данные в двойной массив, а затем отсортировать его?

+0

переменных с номерами почти всегда являются признаком плохого кода. Вместо этого используйте массив (нет «двойной массив», независимо от того, что вы имели в виду). –

+0

Спасибо всем за много ответов, но у меня такое чувство, что некоторым из вас не хватает этого факта, что идентификатор группы должен следовать за номером. Листинг всех номеров без соответствующей группы будет бессмысленным. – user1934039

ответ

0

Да, использование массива - лучшее, что нужно сделать. что-то подобное

$group[1]="5"; 
$group[2]="1"; 

После этого вы можете сортировать ваш массив

+0

, используя asort, например http://php.net/manual/en/array.sorting.php –

0

Поставь группы в массиве

$groups = array("5","1","15","3","7","1","55","0","35"); 
arsort($groups); //This sort the array is descending order 

var_dump($sorted_groups); 

Чтобы напечатать массив в вашем формате используется следующая функция

count = 1; 
foreach($groups as $key => $value) { 
    echo "Group ".($key+1)." is number ".$count++." with ".$value; 
} 
+0

arsort возвращает логическое значение, поэтому не назначайте новую переменную – philipobenito

+0

@happyaccidents, да, спасибо, что указали это. – Starx

1

Прежде всего, используйте массивы (только обычные ары).

Если массив

$group = array(1 => 5, 2 => 1 ...) 

Вы можете использовать arsort функцию.

Здесь я использую числа, а не строки. Если вы будете использовать строки (для значений) вам нужен флаг для сортировки (SORT_NUMERIC)

Больше информации в PHP Manual

Затем используйте foreach

foreach($group as $key => $value){ 
    $key is number of varaiable 
    $value is value of it. 
    you also may add counter to print 1,2,3... 
} 
+0

+1 для использования подходящей функции сортировки. Но вы также забыли флаг сортировки: 'SORT_NUMERIC' –

+0

Это было бы самым простым решением - но не забывайте, что если вы используете строки для значений, то сортировки будут строковыми, а не числовыми. Вам нужно будет присвоить значения цифровому типу, прежде чем пытаться сортировать их. :) – Dan

+0

@fab и Dan, спасибо, я добавил информацию об этом – RiaD

1

использовать массивы для этой цели

$group[1] = "5"; 
$group[2] = "1"; 
$group[3] = "15"; 
$group[4] = "3"; 
$group[5] = "7"; 
$group[6] = "1"; 
$group[7] = "55"; 
$group[8] = "0"; 
$group[9] = "35"; 

, а затем отсортировать его.

arsort($group, SORT_NUMERIC); // SORT_NUMERIC suggested by **fab** 
+1

+1 для использования подходящей функции сортировки. Но вы также забыли флаг сортировки: 'SORT_NUMERIC' –

+0

@fab спасибо за' SORT_NUMERIC'. Я отредактировал свой ответ. :) –

+0

$ group будет перезаписано булевым в этом случае, функции сортировки просто сортируют массив и возвращают true или false – philipobenito

0

Лучший способ сделать это с массивом и arsort. Это сохранит ваши индексы целыми.

arsort возвращает логическое значение, так что не присвоить новой переменной

$groups = array("5","1","15","3","7","1","55","0","35"); 
arsort($groups, SORT_NUMERIC); 

$i = 1; 

foreach ($groups as $key => $val) { 
    echo 'Group ' . $key . ' is number ' . $i . ' with ' . $val; 
    $i++; 
} 
1

Просто ваши данные в виде ассоциативного массива, и сортировать его с ассоциацией осознает то:

$groups = array(
'group1' => "5", 
'group2' => "1", 
'group3' => "15", 
'group4' => "3", 
'group5' => "7", 
'group6' => "1", 
'group7' => "55", 
'group8' => "0", 
'group9' => "35", 
); 

arsort($groups); 

// iteration as usual 
foreach ($groups as $group_name => $value) { 
} 

// getting elements with the array functions based around the array's internal pointer 
reset($groups); // reset the pointer to the start 
print key($groups); // the first element's key 
print current($groups); // the first element's value 
next($groups); // moving the array to the next element 
+0

Это имеет для меня наибольшее значение, так как groupID следует за номером, но как мне «получить доступ» к ассоциативный массив? Допустим, массив отсортирован, как сделано здесь, и я просто хотел напечатать группу с наибольшим числом. Обычно я использовал бы что-то вроде $ group [0], предполагая, что массив был отсортирован, но с ассоциативным массивом у меня нет начальной точки для цели. Или я? – user1934039

+0

Существует множество функций, основанных на внутреннем указателе таких массивов, как 'key',' current', 'reset',' next' и т. Д. Это может помочь, если вы не хотите просто перебирать массив с помощью foreach. Добавлен пример. – complex857

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