Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировать массив
 
 автор: Бамси   (28.05.2007 в 00:52)   письмо автору
 
 

Структура массива

1
-1 Оля
-2 Женя
-3 Даша
2
-1 24
-2 33
-3 28

$goda[2][2] равняеться 33

Надо сортировать массив так что бы года шли сверху - вниз тоесть
33
28
24
Но при этом имена остаються на своих местах, а надо что бы они поменялись местами в том же порядке что и годы. Тоесть если до сортировки у Оли было 24 года, то после у Оли и должно остаца 24 года. а никак ни 33.

   
 
 автор: Trianon   (28.05.2007 в 01:52)   письмо автору
 
   для: Бамси   (28.05.2007 в 00:52)
 

usort() с соответствующей функцией пользовательского сравнения.
Что-то вроде

function cmp($a, $b) { return $b[2]-$a[2]; }

   
 
 автор: Бамси   (28.05.2007 в 17:55)   письмо автору
 
   для: Trianon   (28.05.2007 в 01:52)
 

Я что то не могу понять как пользоваться этой функцией

   
 
 автор: Trianon   (28.05.2007 в 18:11)   письмо автору
 
   для: Бамси   (28.05.2007 в 17:55)
 

пример в описании смотрели?
Что непонятно в примере?

   
 
 автор: Бамси   (28.05.2007 в 18:57)   письмо автору
 
   для: Trianon   (28.05.2007 в 18:11)
 

Честно говоря ничего не понял, не понял что за переменные a and b в функции cmp и что в них пихаеться, и не очень понял как работает сама функция.

Не могли бы вы мне пример сделать вот на этом вот примере который я давал в первом посте.

   
 
 автор: Trianon   (28.05.2007 в 19:03)   письмо автору
 
   для: Бамси   (28.05.2007 в 18:57)
 

Это называется не сделать пример на примере, а решить задачу.
Мог бы. Но не хочу. Если Вам лениво одну строку из документа по ссылке переписать, то мне - для Вас - и подавно.

   
 
 автор: Бамси   (28.05.2007 в 19:08)   письмо автору
 
   для: Trianon   (28.05.2007 в 19:03)
 

Тогда ответье пожалуйста мне на этот вопрос, если вам не лениво.
Что за переменные a and b в функции cmp и что в них пихаеться.

И как реагирует функция сортировки на переданные ей значения, -1, 0, 1

   
 
 автор: Trianon   (28.05.2007 в 19:16)   письмо автору
 
   для: Бамси   (28.05.2007 в 19:08)
 

Функция сортировки пихает в cmp (функцию сравнения элементов) разные пары элементов из сортируемого массива.
Функция cmp каждый раз сравнивает два элемента и возвращает ноль, если элементы равны.
Если первый элемент нужно поместить раньше второго, функция cmp должна вернуть число меньше нуля.
Если первый элемент нужно поместить позже второго, функция cmp должна вернуть число больше нуля.

Саму сортировку за Вас уже написали. Вам остается лишь придумать, как сравнить два элемента и как выдать подходящий ответ.

   
 
 автор: Бамси   (28.05.2007 в 22:38)   письмо автору
 
   для: Trianon   (28.05.2007 в 19:16)
 

Вообщем смысл я понял, но как решить нужную мне задачу я так и не понял.
После обычной сортировки надо как то передать получившийся параметр (1, 0 или -1) в другую функцию которая бы сравнивала уже c заранее известным параметром, и подставляла уже полученный результат из предыдущей функции, вообщем брез полный я не понимаю как это сделать, помогите мне уже елки палки, весь день убил на эту тупую задачу, лучше бы полы в квартире помыл блин.

Вот рисунок представления моих мыслей... бред полный но должно работать, только как сделать я не знаю.

http://b.1asphost.com/Solker/hz.gif

   
 
 автор: Trianon   (28.05.2007 в 23:54)   письмо автору
 
   для: Бамси   (28.05.2007 в 22:38)
 

Ваша задача решается двумя строками.

function cmp($a, $b) { return $b[2]-$a[2]; } 
$goga = usort($goga, 'cmp');


Или даже одной.
$goga = usort($goga, create_function('$a, $b','return $b[2]-$a[2];'));


Я совершенно не понимаю, что мешало заглянуть в мануал по ссылке, которую я Вам дал.
Примеры там были, причем не один.

   
 
 автор: Бамси   (28.05.2007 в 23:59)   письмо автору
 
   для: Trianon   (28.05.2007 в 23:54)
 

Я не понимаю смысл этой строчки
$b[2]-$a[2];

А массив он кстати так и не сортирует:

<?php
$array 
= array('1' => array("Ola","Masha","Vika"), '2' => array("24","54","33"));
echo 
'<pre>';
print_r($array);
echo 
'</pre>';

/*Array
(
    [1] => Array
        (
            [0] => Ola
            [1] => Masha
            [2] => Vika
        )

    [2] => Array
        (
            [0] => 24
            [1] => 54
            [2] => 33
        )
)*/

function cmp($a$b) { return $b[2]-$a[2]; }
usort($array'cmp');

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

/*Array
(
    [0] => Array
        (
            [0] => 24
            [1] => 54
            [2] => 33
        )

    [1] => Array
        (
            [0] => Ola
            [1] => Masha
            [2] => Vika
        )
)
а должно быть:
/*Array
(
    [1] => Array
        (
            [0] => Ola
            [1] => Vika
            [2] => Masha
        )

    [2] => Array
        (
            [0] => 24
            [1] => 33
            [2] => 54
        )
)*/

   
 
 автор: ШИМ   (29.05.2007 в 00:36)   письмо автору
 
   для: Бамси   (28.05.2007 в 00:52)
 

ЭТО 2МЕНРЫЙ МАССИВ?

Может конечно так и не выйдет,
вобщем из этого массива сделать 2 разных массива!
у тебя получится 2 массива один из них будет содержать имена, а второй возраст.
тогда нужно их соединить в один ассоциативный массив, чтобы ключами были имена, а значениями - возраст. Тогда уже отсортировать, следовательно ключи переместяться вместе со значениями так как нужно!!! Может это и ерунда , но я знаю, если есть варианты нужно пробовать!

   
 
 автор: Бамси   (29.05.2007 в 08:55)   письмо автору
 
   для: ШИМ   (29.05.2007 в 00:36)
 

Это не совсем то что мне нужно, операции с массивами проводить мне не надо.

   
 
 автор: Trianon   (29.05.2007 в 10:00)   письмо автору
 
   для: Бамси   (29.05.2007 в 08:55)
 

откуда Вы берете массив?

   
 
 автор: mefestofel   (29.05.2007 в 10:00)   письмо автору
 
   для: Бамси   (28.05.2007 в 00:52)
 

Исходя из формулировки задачи могу предположить, что это Ваша так сказать прихоть, кода который забивает данные в массив, я не видел, но в целях простоты, и для снижения вероятности возникновения коллизий лучше сделать так:

   
 
 автор: Trianon   (29.05.2007 в 10:31)   письмо автору
 
   для: mefestofel   (29.05.2007 в 10:00)
 

Наверняка, код не его, человек просто описание preg_match_all недочитал до нужной точки.

   
 
 автор: mefestofel   (29.05.2007 в 10:52)   письмо автору
 
   для: Trianon   (29.05.2007 в 10:31)
 

скорее всего так и есть....

   
 
 автор: mefestofel   (29.05.2007 в 10:50)   письмо автору
 
   для: mefestofel   (29.05.2007 в 10:00)
 

Это тот код на который Вам намекал Trianon, сложного ничего нет, чиатйте справочники:

<?php
$array 
= array();
$array['TestCase1'] = array('name'=>'Ola','value'=>'24');
$array['TestCase2'] = array('name'=>'Masha','value'=>'54');
$array['TestCase3'] = array('name'=>'Vika','value'=>'33');

function 
multi_sort($my_array$akey)
{
  function 
compare($a$b)
  {
     global 
$key;
     if (
$a[$key]>$b[$key]){
         
$var "-1";
         return 
$var;
     }
     elseif (
$a[$key]<$b[$key]){
         
$var "1";
         return 
$var;
     }
     elseif (
$a[$key]==$b[$key]){
         
$var "0";
         return 
$var;
     }
  }
  
usort($my_array"compare");
  return 
$my_array;
}

$array multi_sort($array$key 'value');

print_r($array);
?>

   
 
 автор: Trianon   (29.05.2007 в 11:34)   письмо автору
 
   для: mefestofel   (29.05.2007 в 10:50)
 

Я на такое не намекал. Оно бы мне в страшном сне не привиделось.
Я просто не понял структуры массива - он вывернут наизнанку.
Если массиву вернуть товарный вид - всё обойдется коротким кодом.

   
 
 автор: mefestofel   (29.05.2007 в 11:59)   письмо автору
 
   для: Trianon   (29.05.2007 в 11:34)
 

Не спорю, пример больше демонстрационный, чтобы показать принцип работы... Если писать очень логичный код, то зачастую многие обитатели этого форума не понимают сути и принципов работы, приходится разжевывать...
Несомненно проще вычесть одно из другого...
Если прийти с таким примером сюда:
http://phpclub.ru/talk/index.php
То скорее всего подвергнут жесткой критике и выгонят из форума навсегда...
:-)

   
 
 автор: Unkind   (29.05.2007 в 13:23)   письмо автору
 
   для: mefestofel   (29.05.2007 в 11:59)
 

Не понимаю почему некоторые отзываются о PHPclub как о месте, доступном для каких-то избранных. Да, он более популярен, да там скорее могут помочь, но только из-за первого пункта.
Но как бы там ни было, это обычные люди, которые сами могут ошибаться. Могу выложить скриншот SQL Injection на PHPclub'е :)

   
 
 автор: mefestofel   (29.05.2007 в 13:55)   письмо автору
 
   для: Unkind   (29.05.2007 в 13:23)
 

Скиньте, пожалуйста мне на мыло, боюсь до того как я успею его поглядеть на форуме, модератор удалит, а я доберусь только вечером до компьютера!

   
 
 автор: Unkind   (29.05.2007 в 14:03)   письмо автору
 
   для: mefestofel   (29.05.2007 в 13:55)
 

Ну вообще-то тут ничего ужасного нет, т.к. я в тот же день сообщил о дыре админу PHPclub'а. Удалит - отошлю по почте.

   
 
 автор: Бамси   (29.05.2007 в 18:13)   письмо автору
 
   для: Бамси   (28.05.2007 в 00:52)
 

Чего то ответа на вопроса я так и не увидел, а только намеки на бездарность и тупость.
Данные я парсю функцией preg_match_all, а он пихает все именно в такой архитектуре, как я писал выше.

   
 
 автор: Trianon   (29.05.2007 в 18:33)   письмо автору
 
   для: Бамси   (29.05.2007 в 18:13)
 

>Данные я парсю функцией preg_match_all
У функции preg_match_all есть 4-й параметр, в котором можно поставить PREG_SET_ORDER. Массив после этого примет человеческий вид.

На тупость и бездарность я не указываю никогда.
Я действительно предпочитаю подсказывать решение, а не выкладывать его "под ключ", как минимум, если задача представляется мне типовым вопросом, многажды разобранным на этом форуме, и не содержит достаточного индивидуального наполнения.

Можете считать это намеком на лень. Для оценки интеллекта и степени дарования Вам придется искать других экспертов.


PS.
>Чего то ответа на вопроса я так и не увидел...
Я Вам задал вопрос. "Откуда Вы берете массив?".
Я увидел на него ответ?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования