Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка двумерного массива по нужному полю 
:(
    Опции темы
RaZoR
Дата 29.6.2004, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



в общем есть двумерный массив к примеру столбцов 10 и строк много... если использовать простые сортировки типа sort(), то сортировка будет по первому полю, а как сделать, чтобы сортировка была по заданному полю? есть ли уже готовые решения или самому писать придется...?
PM MAIL ICQ   Вверх
RaZoR
Дата 29.6.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



раз никто не отвечает написал свою сортировку.. она не самая быстрая, но для небольших массивов пойдет. методом "пузырька"..
Код
function razor_sort($array,$column)
{
$size=sizeof($array);
for ($i=2;$i<=$size;$i++)
{
 for ($j=$size;$j>=$i;$j--)
 {
  if ($array[$j-1][$column]>$array[$j][$column])
  {
   $tmp=$array[$j-1];
   $array[$j-1]=$array[$j];
   $array[$j]=$tmp;
  }
 }
}
return $array;
}

PM MAIL ICQ   Вверх
RaZoR
Дата 29.6.2004, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



не, это слишком медленно.. даже при 500 записях тормозит.. вот переделал на quicksort теперь...
Код
function quicksort($l,$r)
{
global $array,$column;
$i=$l;
$j=$r;
$m=$array[round(($l+$r)/2)][$column];
while ($i<$j)
{
 while ($array[$i][$column]<$m) $i++;
 while ($array[$j][$column]>$m) $j--;
 if ($i<=$j)
 {
  $t=$array[$i];
  $array[$i]=$array[$j];
  $array[$j]=$t;
  $i++;
  $j--;
 }
}
if ($l<$j) quicksort($l,$j);
if ($i<$r) quicksort($i,$r);
return $array;
}

PM MAIL ICQ   Вверх
yUAC
Дата 29.6.2004, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 9.6.2004

Репутация: 3
Всего: 3



Ладно, так и быть, array_multisort тебе поможет
PM MAIL   Вверх
RaZoR
Дата 29.6.2004, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



т.е.? как?
если у меня массив к примеру:
3|asjd|dfja|1997|dfsg
1|hdfs|lkas|2004|sdfg
2|weur|cbsd|1941|ssdh
и нужно его отсортировать по 4 столбцу, то как?
т.е. получить:
2|weur|cbsd|1941|ssdh
3|asjd|dfja|1997|dfsg
1|hdfs|lkas|2004|sdfg
PM MAIL ICQ   Вверх
Akina
Дата 30.6.2004, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



Цитата
array_multisort (PHP 4 )

array_multisort -- Сортировать несколько массивов или многомерные массивы

Описание

логическое array_multisort ( массив массив_1 [, смешанное параметр [, смешанное ... [, массив ...]]])

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

Входные массивы рассматриваются как столбцы таблицы, которую нужно отсортировать по строкам - такой подход напоминает поведение выражения SQL ORDER BY. Первый массив имеет проиоритет в процессе сортировки.

Структура аргументов этой функции немного необычна, но удобна. Первым аргументом должен быть массив. Последующие аргументы могут быть как массивами, так и значениями, определяющими порядок сортировки, приведенными в нижеследующем списке.

Значения, определяющие порядок сортировки:

SORT_ASC - сортировать в возрастающем порядке

SORT_DESC - сортировать в убывающем порядке

Sorting type flags:

SORT_REGULAR - сравнивать элементы обычным образом

SORT_NUMERIC - сравнивать элементы, как если бы они были числами

SORT_STRING - сравнивать элементы, как если бы они были строками

Недопустимым является указание двух флагов сортировки одинакового типа после каждого массива. Флаги сортировки, переданные после аргумента массив, применяются только к этому аргументу - перед тем, как функция начнет обрабатывать следующий массив, эти флаги снова принимают значения по умолчаниюt SORT_ASC и SORT_REGULAR.

Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки.

Пример 1. Сортировка нескольких массивов

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);

В вышеприведенном примере, после того, как будет осуществлена сортировка, первый массив будет содержать 10, "a", 100, 100. Второй - 1, 1, "2", 3. Элементы второго массива, соответствующие идентичным элементам первого (100 и 100), также будут отсортированы.

Пример 2. Сортировка многомерного массива

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
                $ar[1], SORT_NUMERIC, SORT_DESC);

В вышеприведенном примере, после сортировки, первый массив будет содержать 10, 100, 100, "a" (его элементы были отсортированы в возрастающем порядке так, как если бы они были строками), а второй массив будет содержать 1, 3, "2", 1 (элементы отсортированы как числа, в порядке убывания).



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Master
Дата 30.6.2004, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



Akina
не нужно копировать мануал в форум, достаточно дать ссылку.


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
RaZoR
Дата 30.6.2004, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



и все равно я не понял... как сделать то? я читал про эту ф-ию, но как мне ее заюзать, чтобы все получилось?
PM MAIL ICQ   Вверх
Akina
Дата 30.6.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



Master
Трудно дать ссылку на локально установленный MSDN biggrin.gif

RaZoR
Цитата
у меня массив к примеру:
[skipped]
и нужно его отсортировать по 4 столбцу

array_multisort ($ar[3], SORT_NUMERIC)


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
RaZoR
Дата 30.6.2004, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



ясно, а что будет быстрее, array_multisort или usort?
PM MAIL ICQ   Вверх
yUAC
Дата 30.6.2004, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 9.6.2004

Репутация: 3
Всего: 3



Конечно array_multisort. Не забывай, что PHP — интерпретатор, и работает он в сотни раз медленней, чем функции (даже самые кривые), написанные на C и встроенные в PHP
PM MAIL   Вверх
V
Дата 1.7.2004, 04:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Akina @ 30.6.2004, 15:30)
RaZoR
Цитата
у меня массив к примеру:
[skipped]
и нужно его отсортировать по 4 столбцу

array_multisort ($ar[3], SORT_NUMERIC)

Меня тоже очень интересует вопрос сортировки двумерного массива по какому-нибудь столбцу (не по первому).

В двумерном массиве, эприведенная выше функция сортирует только третью строку, а не столбец....
  Вверх
RaZoR
Дата 1.7.2004, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 6.5.2004
Где: Оренбург

Репутация: нет
Всего: 1



у меня щас так:
Код
function cmp($a, $b)
{
global $column;
   if ($a[$column]==$b[$column]) return 0;
   return ($a[$column]<$b[$column]) ? -1:1;
}

function razor_sort($arr,$col)
{
global $array,$column;
$array=$arr;
$column=$col;
usort($array, "cmp");
return $array;
}


$array - массив
$column - нужный столбец
вызывать
$array=razor_sort($array,3);

работает быстро
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.