Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Задание по сортировке массива. Не вникну никак ...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Globus51
Отправлено: 03 Ноября, 2008 - 19:37:56
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2008  


Помог: 0 раз(а)




Задание по сортировке массива. Не вникну никак в суть того как вообще здесь сортировка происходит при работе функции.
Об"ясните...

................................ .......


3. Дан массив $a = array("second","third","first"); Отсортировать значения элементов массива так, чтобы элемент third был первым, second – вторым, first – третьим.

<?
$a = array ("second","third","first");
usort ($a,"tes");
function tes ($c, $d) {
if ($c == "third" && $d == "second") return -1;
if ($c == "third" && $d == "first") return -1;
if ($c == "first" && $d == "second") return 1;
if ($c == "second" && $d == "third") return 1;
if ($c == "first" && $d == "third") return 1;
}
print_r ($a);
?>
 
 Top
Champion Супермодератор
Отправлено: 03 Ноября, 2008 - 19:57:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Читаем мануал к функции usort и всё. Пользовательская функция возвращает 0 когда элементы равны, 1, когда первый больше, -1, когда наоборот.
 
 Top
Globus51
Отправлено: 03 Ноября, 2008 - 20:04:24
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2008  


Помог: 0 раз(а)




Читал.
Но полностью не разберусь ника.

Вот в моем примере первая строка в работе функции:

if ($c == "third" && $d == "second") return -1;

что происходит здесь?
 
 Top
Champion Супермодератор
Отправлено: 03 Ноября, 2008 - 20:07:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Функция сравнивает 2 числа. Если первое - third, второе - second, функция вернет -1 и будет считаться, что third меньше, чем second. Функция usort, зная об этом поместит элемент со значение third раньше, чем с second. И остальные сравниваются так же
 
 Top
Globus51
Отправлено: 03 Ноября, 2008 - 20:25:17
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2008  


Помог: 0 раз(а)




Champion пишет:
Функция сравнивает 2 числа. Если первое - third, второе - second, функция вернет -1 и будет считаться, что third меньше, чем second. Функция usort, зная об этом поместит элемент со значение third раньше, чем с second. И остальные сравниваются так же


А что происходит ещё раньше? То есть какие значения имеют $c и $d перед тем как начнется выполнение первой строки функции:
if ($c == "third" && $d == "second" return -1;

?
 
 Top
Champion Супермодератор
Отправлено: 03 Ноября, 2008 - 20:46:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




по два значения массива. usort сама передаст. Пользовательская функция просто описывает правила сравнения. И всё
 
 Top
Globus51
Отправлено: 03 Ноября, 2008 - 21:23:17
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2008  


Помог: 0 раз(а)




стало быть вначале, до запуска функции $="second" и $d="third"

затем начинает работу функция tes

первые 3 строки в ней пропускаем и переходим сразу к строке 4: if ($c == "second" && $d == "third") return 1;

результатом работы строки 4 имеем: return 1

так?
 
 Top
Globus51
Отправлено: 04 Ноября, 2008 - 23:15:35
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2008  


Помог: 0 раз(а)




Вот так пробую - оставил в функции только одно условие сортировки и добавил ещё один элемент массива - "skot".

<?
$a = array ("second","third","first", "skot");
usort ($a,"tes");
function tes ($c, $d) {
if ($c == "third" && $d == "second") return -1;
}
print_r ($a);
?>

Вот скажите как должно отсортироваться?
 
 Top
Champion Супермодератор
Отправлено: 05 Ноября, 2008 - 08:41:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Значение third в массиве всегда будет меньше second, а все остальные никак не обработаются.
(Добавление)
Сами запустили бы и вывели. Зачем спрашивать?)
 
 Top
Leviafant
Отправлено: 13 Апреля, 2009 - 11:44:01
Post Id



Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Авг. 2008  
Откуда: Курская обл


Помог: 0 раз(а)




не получается массив сортировать
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $dir = scandir("file");
  4.  
  5. foreach ($dir as $fileinfo)
  6. {
  7.     if ($fileinfo != "." && $fileinfo != "..")
  8.         {
  9.         $_Content[] = $fileinfo;
  10.     }
  11. }
  12.  
  13. $_Content2 = asort($_Content);
  14.  
  15. print_r ($_Content2);
  16. ?>
  17.  

print_r ($_Content2); возвращает 1, а не отсортированный массив, почему?
если написать print_r ($_Content); то он возвращает список файлов и папок
PHP:
скопировать код в буфер обмена
  1.  
  2. Array ( [0] => !novaya [1] => adm [2] => cache [3] => docs [4] => download [5] => eng00000.gif [6] => images )
  3.  

Что я делаю не так?


-----
Пока Рок жив буду жить и Я
 
 Top
Stierus Супермодератор
Отправлено: 13 Апреля, 2009 - 12:29:36
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
$_Content2 = asort($_Content);

print_r ($_Content2);
замени на

(Добавление)
PHP:
скопировать код в буфер обмена
  1. function tes ($first, $second) {
  2.         $first = strtolower($first);
  3.         $second = strtolower($second);
  4.         $len_first = strlen($first);
  5.         $len_second = strlen($second);
  6.         if($len_first > $len_second ){
  7.                 $min_len = $len_second;
  8.         }
  9.         else{
  10.                 $min_len = $len_first;
  11.         }
  12.         for($len=0; $len<$min_len; $len++){
  13.                 if(ord($first) > ord($second)){
  14.                         return 1;
  15.                 }
  16.                 elseif(ord($first) < ord($second)){
  17.                         return -1;
  18.                 }
  19.         }
  20.         return 0;
  21. }
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Прочее »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB