отсортироать массив

IMW

Guest
отсортироать массив

задача отсортировать массив
0->(1,2,20)
1->(2,3,40)
2->(1,1,0)
3->(1,3,100)
4->(2,4,50)

отсортировать надо по скобкам z->(a,b,c) сначала по 'a' потом по 'b' а потом по 'c ' на z наплевать, мне надо только порядок отсортированных z, полдня уже мучаюсь. Заранее благодарен

из даного примера z должны стоять так

2
0
3
1
4

заранее благодарен
 

Stm

Новичок
void usort ( array array, callback cmp_function)

function cmp_function($a, $b) {
if ($a.a < $b.a){
return -1;
}
else if( $a.a > $b.a ){
return 1;
}
else{
if ($a.b < $b.b){
return -1;
}
else if( $a.b > $b.b ){
return 1;
}
else{
if ($a.c < $b.c){
return -1;
}
else if( $a.c > $b.c ){
return 1;
}
else{
return 0;
}
}
}
}
 

IMW

Guest
ничего не получаеьбся можно напмсать конкретно как использовать функцию сортировкм и вложнгою функцию для моего примера допустим мой массив называеться $mas
 

IMW

Guest
неужели все гуру вымерли или вопрос слишком сложный?
 

Stm

Новичок
вопрос слишком не внятный
отсортировать массив чего ? (тип элементов каков).

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

так что usort($mas,"mas_cmp");
 

IMW

Guest
<?
function mas_cmp($a, $b) {
if ($a.a < $b.a){
return -1;
}
else if( $a.a > $b.a ){
return 1;
}
else{
if ($a.b < $b.b){
return -1;
}
else if( $a.b > $b.b ){
return 1;
}
else{
if ($a.c < $b.c){
return -1;
}
else if( $a.c > $b.c ){
return 1;
}
else{
return 0;
}
}
}
}
$mas=array(1=>array(0,2,2) , 2=>array(0,1,2) , 3=>array(1,1,2), 4=>array(1,1,1), 5=>array(0,0,0), 6=>array(2,2,2) );



usort($mas,"mas_cmp");
while (list($key,$val) = each ($mas))
{
echo $key."=>".$val[0].$val[1].$val[2]."<br>";
}

?>

Выводит
0=>000
1=>222
2=>111
3=>112
4=>012
5=>022

а ожидалось
5=>0,0,0
2=>0,1,2
1=>0,2,2
4=>1,1,1
3=>1,1,2
6=>2,2,2

может я неправильно юзаю функцию или неправильно вывожу, почему то ключи не те?? или функция неправильно работет или все вместе )
 

fixxxer

К.О.
Партнер клуба
:)
поставь первой строчкой error_reporting(E_ALL)
прочитай нотисы
подумай:)
 

fixxxer

К.О.
Партнер клуба
или ты думал, что тебе дали код который можно тупо скопипейстить и все будет работать? :)
ты вообще его хоть читал? :)или тупо ^C ^V? :)
 

Vasya

Guest
Вот так работает:
PHP:
<pre><?
function mas_cmp($a, $b) {
	if ($a[0] < $b[0]) return -1;
	else if( $a[0] > $b[0] ) return 1;
	else {
		if ($a[1] < $b[1]) return -1;
		else if( $a[1] > $b[1] ) return 1;
		else {
			if ($a[2] < $b[2]) return -1;
			else if( $a[2] > $b[2] ) return 1;
			else return 0;
		}
	}
} 

$mas=array(
	1=>array(0,2,2),
	2=>array(0,1,2),
	3=>array(1,1,2),
	4=>array(1,1,1),
	5=>array(0,0,0),
	6=>array(2,2,2)
);

uasort($mas,"mas_cmp");
//print_r($mas);
reset($mas);
while (list($key,$val) = each ($mas))
{
echo $key."=>".$val[0].$val[1].$val[2]."<br>";
}
?></pre>
 

Vasya

Guest
И даже еще круче:
PHP:
function mas_cmp($a, $b) {
	for(reset($a); list($k,$v) = each($a); ) {
		if($a[$k] < $b[$k]) return -1;
		else if($a[$k] > $b[$k]) return 1;
	}
	return 0;
}
 
Сверху