[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод ключей массива
Алекса
Приветик дорогие форумчане. Помогите начинающей програмистке)) есть массив, элементы массива это разные числа. Мне нужно вывести десять элементов массива с самыми большими числами.Вернее вывести нужно не сами числа а их ключи. Заранее спасибо.



Спустя 14 минут, 58 секунд (15.02.2011 - 21:57) sergeiss написал(а):
Для начала озвучь свою версию кода, при его наличии!!! Тогда будет более предметный разговор smile.gif Пока же не о чем говорить.

Весь флуд тут: http://phpforum.ru/index.php?act=ST&f=22&t=40620&st=0

Спустя 1 час, 3 минуты, 33 секунды (15.02.2011 - 23:00) Алекса написал(а):
Просто я с телефона сижу.код писать неудобно.но я попробую.
$arr=file('file.txt');
$sort_arr=rsort($arr);
for($i=0;$i<10;$i++)
{
$keys[$i]=array_search($sort_arr[$i],$arr);
unset($arr[$keys[$i]]);
}

массив $keys должен содержать ключи самых больших чисел по убыванию.Может кто то предложит код получше?

Спустя 9 минут, 42 секунды (15.02.2011 - 23:10) Snus написал(а):
Алекса
function cmp($a, $b){
return strcmp($b, $a);
}

$arr = file('file.txt');
usort($arr, 'cmp');

$i = 0;
foreach($arr as $key => &$val){
$i++;
echo $key.'<br>';
if($i >= 10) break;
}

Спустя 4 минуты, 45 секунд (15.02.2011 - 23:15) sergeiss написал(а):
Алекса - это уже лучше :) Только ты заходи с компа, а не с телефона. Потому что удобнее будет писать. В частности, тут есть тэги подсветки кода, чтобы он был более читаемый. Для начала я твой код выделю...

И по коду. Тут лучше цикл foreach использовать. Потому что тогда ты получишь более универсальный код, который может работать с ассоциативными ключами массивов. И unset зачем тут?

Примерно так...
$arr=file('file.txt');
$sort_arr=rsort($arr);
$i=0;
$keys=array();
foreach( $sort_arr as $key => $val )
{
$keys[$i]=$key;
if( $i++ == 10 ) break;
}
$var_dump( $keys );

Спустя 2 минуты, 33 секунды (15.02.2011 - 23:17) Snus написал(а):
sergeiss
функция rsort здесь не подходит, знаешь почему? wink.gif

Спустя 4 минуты, 7 секунд (15.02.2011 - 23:21) sergeiss написал(а):
Snus - ну пусть будет arsort() smile.gif Это был бы следующий вопрос от девушки...

Спустя 9 минут, 16 секунд (15.02.2011 - 23:30) Алекса написал(а):
Ой! огромное всем спасибо! А почему rsort не подходит? unset я использовала потому что в массиве могут быть элементы с одинаковыми числами а мне нужно вывести именно десять самых больших чисел,даже если они одинаковые!это типа рейтинг балов.номер строки в file.txt это id пользователя а значение строки это баллы.

Спустя 17 минут, 5 секунд (15.02.2011 - 23:48) sergeiss написал(а):
rsort изменяет ключи, arsort оставляет их. Если у тебя могут быть неуникальные значения... Тогда в моём коде изменяется только одна строка:
$sort_arr=asort(array_unique($arr));
// или так
$sort_arr=array_unique(asort($arr))
;
Результаты будут разные. И даже при разных запусках одного и того же варианта не гарантируется одинаковый результат, если для разных ключей "в топе-10" есть неуниальные величины. Подробнее читай хэлп по указанным функциям.

Спустя 4 часа, 21 минута, 16 секунд (16.02.2011 - 04:09) Invis1ble написал(а):
Алекса, sergeiss
функции *sort() возвращают булево, зачем же вы присваиваете результат переменной? у вас warning будет на строчке с циклом wink.gif

Спустя 9 минут, 58 секунд (16.02.2011 - 04:19) Invis1ble написал(а):
Мое решение:
arsort($array);
$keys = array_slice(array_keys($array), 0, 10);

Спустя 6 часов, 9 минут, 28 секунд (16.02.2011 - 10:28) sergeiss написал(а):
Цитата (Invis1ble @ 16.02.2011 - 05:09)
функции *sort() возвращают булево, зачем же вы присваиваете результат переменной?

Бес попутал, наверное... И вообще - у меня отмаза есть smile.gif С вечера температура была около 38, так что невнимательный был.

Спустя 36 секунд (16.02.2011 - 10:29) linker написал(а):
Invis1ble
Эх, опередил меня.

Спустя 9 часов, 21 минута, 29 секунд (16.02.2011 - 19:50) dimson написал(а):
Вопрос новичка, почему такой будет код работать:
<?
$i=0;
$arr=array(12,4,50,400,450,460,70,20,5,18,43,41,17,700);
arsort($arr);
foreach ($arr as $key => $val)
{
if($i==10)
{
break(1);
}
else{
echo "<b>$key - $val</b><br>";
$i++;
}
}

?>


а тут уже не правельно сортировка работате:
<?
$i=0;
$arr=file('file.txt');
arsort($arr);
foreach ($arr as $key => $val)
{
if($i==10)
{
break(1);
}
else{
echo "<b>$key - $val</b><br>";
$i++;
}
}

?>

Заранее спасибо.

Спустя 52 минуты, 16 секунд (16.02.2011 - 20:43) Snus написал(а):
dimson
Покажи результат второго скрипта.

Спустя 1 час, 1 минута, 51 секунда (16.02.2011 - 21:44) dimson написал(а):
Второй скрипт выводит:
13 - 700
6 - 70
2 - 50
8 - 5
5 - 460
4 - 450
10 - 43
11 - 41
3 - 400
1 - 4

Спустя 18 минут, 42 секунды (16.02.2011 - 22:03) Invis1ble написал(а):
Цитата
не правельно сортировка работате

наверно потому что при получении из файла элементы массива имеют тип string.
попробуй заменить
$arr=file('file.txt');

на
$arr = array_map('intval', file('file.txt'));

Спустя 20 минут, 44 секунды (16.02.2011 - 22:24) Guest написал(а):
Да, так все заработало. Я так понимаю что с помощью функции array_map и параметра "intval" все значения массива получили числовое значение?

Спустя 8 минут, 27 секунд (16.02.2011 - 22:32) Invis1ble написал(а):
intval() - это функция приводящая к типу integer, а array_map() применяет эту функцию рекурсивно для всех элементов массива
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.