|
|
|
| Подскажите, пожалуйста, можно ли отсортировать вывод результатов функцией printf() по убыванию числовых значений?
Например, сортировка выводимых записей по возрасту (по убыванию):
printf ("Имя: %s, возраст: %u", $name,$vozrast);
|
Если можно, покажите пожалуйста на примере кода. | |
|
|
|
|
|
|
|
для: sega_z
(28.03.2013 в 01:16)
| | $name,$vozrast откуда берете? | |
|
|
|
|
|
|
|
для: Valick
(28.03.2013 в 07:12)
| | $name - строковые записи из базы данных, а $vozrast вычисляет одна из функций.
Точнее, $vozrast это числовые результаты сравнения двух строк функцией similar_text(); по которым и нужно сортировать записи из базы данных (просто немного не удачный я привел пример). | |
|
|
|
|
|
|
|
для: sega_z
(28.03.2013 в 12:36)
| |
$vozrast это числовые результаты сравнения двух строк
|
а что обычная дата рождения не указана в БД??? | |
|
|
|
|
|
|
|
для: Valick
(28.03.2013 в 12:43)
| | В том то и дело, что нет, он вычисляется уже после выборки из б.д. Если бы была указана, было бы намного проще. Я говорю, не совсем удачный привел пример, это не возраст, а сравнение двух строк.
Причем, забыл сказать, что функция printf() выводит значения из б.д. в цикле do while
Или все таки нужно выводить строковые значения $name из б.д., затем определять переменную $vozrast, затем заносить её в б.д., а затем уже выводить с использованием ORDER BY - это же долго и лишняя нагрузка на сервер? | |
|
|
|
|
|
|
|
для: sega_z
(28.03.2013 в 12:36)
| | Функция printf() ничего не сортирует, не ее это задачи, она может вывести только в указанном порядке. | |
|
|
|
|
|
|
|
для: confirm
(28.03.2013 в 12:44)
| | Ну а как задать этот порядок, чтобы printf() выводила в цикле do while значения $vozrast и $name в порядке убывания $vozrast ?
Или все таки нужно выводить строковые значения $name из б.д., затем определять переменную $vozrast, затем заносить её в б.д., а затем уже выводить с использованием ORDER BY - это же долго и лишняя нагрузка на сервер? | |
|
|
|
|
|
|
|
для: sega_z
(28.03.2013 в 12:59)
| | Почему именно do while? Сдается, что у вас это "болезнь" распространенная. Просто while.
А как указать порядок вывода переменных описано в описании функции sprintf. Это порядок вами указываемый, который отношения к сортировке не имеет, сортировать надо до вывода. А с проблемами запроса в другой раздел. | |
|
|
|
|
|
|
|
для: sega_z
(28.03.2013 в 12:59)
| | > Ну а как задать этот порядок, чтобы printf() выводила в цикле do while значения $vozrast и $name
> в порядке убывания $vozrast ?
printf() не выводит ни в каком порядке.
printf вызывается столько раз, сколько раз повторяется код цикла.
Если вы напишете
<?php
for($i=1;$i<=3;$i++){
printf("%d",$i);
}
| это будет то же самое, что и
<?php
printf("%d",1);
printf("%d",2);
printf("%d",3);
|
Следовательно, у вас вывод идет в том порядке, в котором у вас представлены исходные данные.
Если вас это не устраивает, значит нужно отсортировать исходные данные.
Т.к. в MySQL (на сколько я знаю) нет аналога функции similar_text(), придется сортировать в PHP.
Для этого нужно занести результат запроса в многомерный массив и воспользоваться функцией array_multisort().
Примерно так:
<?php
$data = array();
$name = array();
$vozrast = array();
$res = // MySQL-запрос
// заносим данные в массивы
while( $row = mysql_fetch_assoc($res) ){
$data[] = $row;
$name[] = $row['name'];
$vozrast[] = // как вы там вычисляете его....
}
// сортируем результат
array_multisort($vozrast, SORT_DESC, $name, SORT_ASC, $data);
// а вот только теперь выводим
foreach($data as $d)
printf ("Имя: %s, возраст: %u", $d['name'],$d['vozrast']);
|
P.S. Пишу в браузере из головы, так что возможны опечатки. | |
|
|
|
|
|
|
|
для: Sfinks
(28.03.2013 в 14:28)
| | Спасибо за идею, сейчас попробую использовать... | |
|
|
|