Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > сортировка двумерного массива по нужному полю


Автор: RaZoR 29.6.2004, 20:03
в общем есть двумерный массив к примеру столбцов 10 и строк много... если использовать простые сортировки типа sort(), то сортировка будет по первому полю, а как сделать, чтобы сортировка была по заданному полю? есть ли уже готовые решения или самому писать придется...?

Автор: RaZoR 29.6.2004, 21:00
раз никто не отвечает написал свою сортировку.. она не самая быстрая, но для небольших массивов пойдет. методом "пузырька"..
Код
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;
}

Автор: RaZoR 29.6.2004, 21:47
не, это слишком медленно.. даже при 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;
}

Автор: yUAC 29.6.2004, 22:44
Ладно, так и быть, array_multisort тебе поможет

Автор: RaZoR 29.6.2004, 23:16
т.е.? как?
если у меня массив к примеру:
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

Автор: Akina 30.6.2004, 08:48
Цитата
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 (элементы отсортированы как числа, в порядке убывания).

Автор: Master 30.6.2004, 10:03
Akina
не нужно копировать мануал в форум, достаточно дать ссылку.

Автор: RaZoR 30.6.2004, 12:08
и все равно я не понял... как сделать то? я читал про эту ф-ию, но как мне ее заюзать, чтобы все получилось?

Автор: Akina 30.6.2004, 15:30
Master
Трудно дать ссылку на локально установленный MSDN biggrin.gif

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

array_multisort ($ar[3], SORT_NUMERIC)

Автор: RaZoR 30.6.2004, 17:19
ясно, а что будет быстрее, array_multisort или usort?

Автор: yUAC 30.6.2004, 21:19
Конечно array_multisort. Не забывай, что PHP — интерпретатор, и работает он в сотни раз медленней, чем функции (даже самые кривые), написанные на C и встроенные в PHP

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

array_multisort ($ar[3], SORT_NUMERIC)

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

В двумерном массиве, эприведенная выше функция сортирует только третью строку, а не столбец....

Автор: RaZoR 1.7.2004, 10:56
у меня щас так:
Код
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);

работает быстро

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)