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

XfroSt

Новичок
Сортировка многомерного массива

Есть многомерный массив типа

table (
['city'],['name'],['age'],['sex']....['n']
as |1s |20 |m |....| |
bn |hk |11 |m |....| |
...
zx |nt |33 |f |....| |
)

т.е.
как таблица MySQL
Как его отсортировать по столбцам типа ORDER BY в MySQL

использовал функцию

PHP:
array_multisort($table,$table["city"], SORT_ASC, SORT_STRING);
но при выводе в таблицу


PHP:
for ($ia = 0; $ia < count($table["city"]); $ia++)              	
{                   
echo"       <tr>
<td><center><font size=2>".$table["city"][$ia]."</td>
<td><center><font size=2>".$table["name"][$ia]."</td>
..................................................................................
<td><center><font size=2>".$table["n"][$ia]."</td>
      </tr>";                  }
Сортируется только столбец city остальные остаются такимиже .... нет связи...

Подскажите что я делаю не так вывожу и/или сортирую ?
 

XfroSt

Новичок
А можно с примером ?

Дело в том что я используя функцию multisort добился таки нужного результата, но код получился грамоздкий :

PHP:
array_multisort($table["city"],$table["name"],$table["age"]....$table["n"], SORT_ASC, SORT_STRING);
каждый раз приходимться перечислять все подмассивы.

В usort надо еще и описать функцию которая сравнивала бы все значения ?
 
И вот прошло два года. А проблема та же. uasort не могу использовать. надо через multysort.

$inside_cats[0] = array("рука", 3, 5);
$inside_cats[1] = array("нога", 5, 45);
$inside_cats[2] = array("рука", 56, 34);
$inside_cats[3] = array("голова", 3, 6);
$inside_cats[4] = array("нога", 5, 9);
$inside_cats[5] = array("голова", 0, 2); ... по первому параметру .т.е. что бы руки шли вместе, потом ноги и т.д. Кто нибудь вывел правило как работает это "упорядочивание" ?

-~{}~ 06.03.07 14:37:

у кого возникнет подобная проблема используйте sort(). она сортирует по первому эл-ту - как раз мои руки и ноги.

-~{}~ 15.06.07 17:42:

Да, это конечно хорошо, но как отсортировать по двум параметрам. Кто нибудь понимает, как работает эта конченая мультисортировка !!??
Просьба, тех кто не знает, не говорить мне написать свою и не кидать ссылки на пхп`шный мануал. Заранее благодарю.
 

Garret

Кто здесь?
Откуда такие археологи берутся? Причем ничего по теме.

Думаю Вася за 9 месяцев наконец то решил свою проблему.
 

soulhunter

Новичок
function multiSort($dataArray, $sortColumn, $sortOrder = SORT_ASC, $sortComparsion = SORT_REGULAR){

/*
Функция сортировки многомерного массива
$dataArray - массив для сортировки
$sortColumn - колонка, по которой нужно проводить сортировку
$sortOrder - порядок сортировки, возможные варианты:
SORT_ASC - по возрастанию
SORT_DESC - по убыванию
$sortComparsion - метод сравнения элементов в массиве, возможные варианты:
SORT_REGULAR - сравнивать элементы обычным образом
SORT_NUMERIC - сравнивать элементы, как если бы они были числами
SORT_STRING - сравнивать элементы, как если бы они были строками
*/

$sortArray = array();
foreach ($dataArray as $subArray){
$sortArray[] = $subArray[$sortColumn];
}
array_multisort($sortArray, $sortOrder, $sortComparsion, $dataArray, $sortOrder, $sortComparsion);
return $dataArray;
}

-~{}~ 15.06.07 21:08:

так понятнее:
PHP:
function multiSort($dataArray, $sortColumn, $sortOrder = SORT_ASC, $sortComparsion = SORT_REGULAR){
		
		/*
		Функция сортировки многомерного массива
		$dataArray       - массив для сортировки
		$sortColumn      - колонка, по которой нужно проводить сортировку
		$sortOrder       - порядок сортировки, возможные варианты:
			SORT_ASC     - по возрастанию
			SORT_DESC    - по убыванию
		$sortComparsion  - метод сравнения элементов в массиве, возможные варианты:
			SORT_REGULAR - сравнивать элементы обычным образом
			SORT_NUMERIC - сравнивать элементы, как если бы они были числами
			SORT_STRING  - сравнивать элементы, как если бы они были строками
		*/
		
		$sortArray = array();
		foreach ($dataArray as $subArray){
			$sortArray[] = $subArray[$sortColumn];
		}
		array_multisort($sortArray, $sortOrder, $sortComparsion, $dataArray, $sortOrder, $sortComparsion);
		return $dataArray;
	}
 
Trianon
Во первых usort вызывает пользовательскую ф-ию, которую как я сказал, ещё написать надо, а во вторых по-моему в пхп`шном ооп не работает такая фигня : usort(array(...), $some_method_of_class). Если я не ошибаюсь конечно.
Garret
Не решил и не за 9 :)
soulhunter
Мужчина, вам огромное спасибо, я всёк как работает эта хрень. Алилуя !! В мануале ни хрена не понятно.
Теперь у меня другой вопрос. Зачем мне всё это надо было ? Есть 6 таблиц в БД - классика: пользователи, заказы, детали заказа от одного источника и три такие же от другого. Мне надо выводить сводку на странице в одной таблице отсортировав по статусу заказа и времени. Я делаю:
$res_1 =mysql_fethc_assoc(mysql_query(SELECT status, time, ... FROM ...)); и $res_2 соответственно рез-т запроса к таблицам второго источника. Потом сливаю результаты array_mergre(res_1, res_2) и сортирую вашим замечательным мультисортом. всё - задача выполнена. Так вот, можно ли мне одним запросом получать данные из всех шести таблиц? Тогда я бы не парился и делал всё это через ORDER BY. Естественно таблицы от одного источника не связаны с таблицами другого, СУБД - MySQL.
 

Bitterman

Новичок
Вася Патриков
А почему нельзя все данные хранить в трех таблицах? То есть пользователи для всех источников в одной таблице, заказы - в другой и т. д.?
 
не знаю, но это уже данность и её не изменить. просто первые три таблицы для заказов через интернет, а другие забиваются вручную - заказы по телефону. вот и решили их разделить.
 

Bitterman

Новичок
Вася Патриков
Попробуй UNION. Хотя, ИМХО, гораздо логичнее объединить таблицы.
 
Спасибо, хоть буду знать, где копать.

-~{}~ 18.06.07 17:01:

Таблицы кстати, хоть и несут по сути одинаковую информацию, но всё же имеют несколько разную структуру.
 
Да, с UNION всё отлично работает. Если кому интересно - http://www.sql.ru/docs/sql/u_sql/ch14.shtml, да и в мануале тоже кое что написано.
SELECT status, posttime FROM table_1 WHERE ...
UNION
SELECT status, posttime, FROM table_2 WHERE ...;

status posttime
in_process 182343485
in_process 1182369220
in_process 1182343134
in_process 1182409046
waiting_check 1182412787

Но опять есть косяк - я не могу понять из какой таблицы, какая запись. Есть вариант поставить метку ? Т.е. третью колонку label
значение которой у table_1 будет равно еденице, а у table_2 двойке. Ну если нет, так нет.
 

oracloid

совсем кукус
зачем? прямо в запрос и добавь свою метку:

SELECT status, posttime, 1 label FROM table_1 WHERE ...
UNION
SELECT status, posttime, 2 label FROM table_2 WHERE ...;
 
Сверху