[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка массивов
ambt
Здравствуйте, продолжаю изучение массивов и столкнулся со следующим заданием:

Сформировать список из 20 элементов и отсортировать этот массив чтобы числа выводились по модулю (0,-1,2,-3,-4,5,...)



Спустя 1 час, 39 минут, 9 секунд (9.02.2011 - 01:14) kovaldm написал(а):
Написать пользовательскую функцию.

Спустя 21 час, 30 минут, 5 секунд (9.02.2011 - 22:44) ambt написал(а):
мне это задание надо сделать через функцию usort и без функции strcmp!
оно у меня что-то вообще ни как не клеится :(

<?php
function
my_usort($a,$b) {return ($a,$b);} //как тут обойтись без strcmp понятия не имею, а ошибку выдает :(
$m=array(-18,-16,-14,-12,-10,-8,-6,-4,-3,-1,0,2,5,7,9,11,13,15,17,19); //и с последовательностью выполнения тоже теряюсь что куда и когда...
usort ($m,"my_usort");

????


}
?>

Спустя 7 минут, 40 секунд (9.02.2011 - 22:52) sergeiss написал(а):
Цитата (ambt @ 9.02.2011 - 23:44)
{return ($a,$b);} /

Это чего такое????? Что ты хотел сказать этим выражением?

Пользовательская функция (твоя которая) должна возвращать результат сравнения модулей чисел (насколько я понял)... При чем тут strcmp? Конечно, она не нужна smile.gif

Спустя 13 секунд (9.02.2011 - 22:52) Snus написал(а):
ambt
Держи, студент :)

<?php
function
cmp($a, $b){
if ($a == $b) return 0;

if($a < 0) $a = $a * -1;
if($b < 0) $b = $b * -1;

return ($a < $b) ? -1 : 1;
}


$m = array(-18,-16,-14,-12,-10,-8,-6,-4,-3,-1,0,2,5,7,9,11,13,15,17,19);
usort ($m, 'cmp');

echo '<pre>';
print_r($m);
echo '</pre>';

?>


На выходе:

Array
(
[0] => 0
[1] => -1
[2] => 2
[3] => -3
[4] => -4
[5] => 5
[6] => -6
[7] => 7
[8] => -8
[9] => 9
[10] => -10
[11] => 11
[12] => -12
[13] => 13
[14] => -14
[15] => 15
[16] => -16
[17] => 17
[18] => -18
[19] => 19
)


Спустя 3 минуты, 45 секунд (9.02.2011 - 22:56) sergeiss написал(а):
Snus - а ты слышал про такую функцию, как abs()? wink.gif

Спустя 2 минуты, 14 секунд (9.02.2011 - 22:58) Snus написал(а):
sergeiss
Слышал, конечно, но как-то не сообразил сразу :)

function cmp($a, $b){
if ($a == $b) return 0;
return (abs($a) < abs($b)) ? -1 : 1;
}

Спустя 4 минуты, 55 секунд (9.02.2011 - 23:03) sergeiss написал(а):
Snus - можно смело выкинуть первую строку из функции... В ней все равно смысла нету. И поставить в условии не "меньше", а "меньше или равно". Этого будет более, чем достаточно. Согласен?

Спустя 4 минуты (9.02.2011 - 23:07) Snus написал(а):
sergeiss
Хотел придраться, да не к чему smile.gif да, ты прав. smile.gif

Спустя 8 минут, 28 секунд (9.02.2011 - 23:15) sergeiss написал(а):
Цитата (Snus @ 10.02.2011 - 00:07)
Хотел придраться, да не к чему

В 4 раза сократил количество строк. Причем сам, надо заметить. А мог и с самого начала написать так smile.gif
Хотя было бы лучше, чтобы ТС сам до этого дошел, с помощью "наводящих подсказок".

Спустя 9 минут, 31 секунда (9.02.2011 - 23:25) ambt написал(а):
sergeiss, Snus - огромнейшее вам спасибо!!!
Я бы это задание конечно бы еще долго мучал!!!

<?php
function
my_usort($a,$b){
if($a<0) $a=$a*-1;
if($b<0) $b=$b*-1;
return ($a>=$b);
}
$m=array(-18,-16,-14,-12,-10,-8,-6,-4,-3,-1,0,2,5,7,9,11,13,15,17,19);
usort ($m, 'my_usort');

//Каким способом можно еще вывести массив на экран с помощью echo?

foreach($m as $value) {
echo $value.'<br />';
}
?>

Спустя 1 минута, 39 секунд (9.02.2011 - 23:26) sergeiss написал(а):
Цитата (ambt @ 10.02.2011 - 00:25)
function my_usort($a,$b){
if($a<0) $a=$a*-1;
if($b<0) $b=$b*-1;
return ($a>=$b);
}

Это что??? Тут есть куда более компактный вариант этой функции, в одну строку... Или ты его не видишь? blink.gif

Спустя 2 минуты, 26 секунд (9.02.2011 - 23:29) Snus написал(а):
ambt
Да не за что, конечно, но ты невнимательно читал, что мы писали ))

<?php
function
my_usort($a, $b){
return (abs($a) <= abs($b)) ? -1 : 1;
};

$m = array(-18,-16,-14,-12,-10,-8,-6,-4,-3,-1,0,2,5,7,9,11,13,15,17,19);
usort ($m, 'my_usort');

foreach($m as &$value) {
echo $value.'<br />';
}

?>

Спустя 9 минут, 52 секунды (9.02.2011 - 23:39) ambt написал(а):
Цитата
Это что??? Тут есть куда более компактный вариант этой функции, в одну строку... Или ты его не видишь?

Цитата
Да не за что, конечно, но ты невнимательно читал, что мы писали ))


функцию abs() я взял себе на заметку, но тут мне надо обойтись без неё...

return ($a < $b) ? -1 : 1;; //Я не могу понять зачем писать так если можно написать...
return ($a>=$b); //Вот так...

Спустя 5 минут, 15 секунд (9.02.2011 - 23:44) Snus написал(а):
ambt
Воистину! И правда так тоже работает :))
function cmp($a, $b){
return (abs($a) >= abs($b));
}


Но это уже больше похоже на быдло-код :)

Спустя 13 минут, 23 секунды (9.02.2011 - 23:57) ambt написал(а):
Snus

спасибо, учту!)))

И всё таки какие есть еще способы вывода массива на экран с помощью echo() ?

Спустя 12 минут, 24 секунды (10.02.2011 - 00:10) Snus написал(а):
ambt
echo implode('<br>', $m);

Спустя 16 минут, 36 секунд (10.02.2011 - 00:26) ambt написал(а):
Snus
Супер, спасибо! Классный метод! smile.gif
Быстрый ответ:

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