用PHP双重排序数组

时间:2016-03-08 11:05:04

标签: php arrays sorting

我有一个数组排序如下:

Array ( 
    [0] => Array ( 
                    [x] => 0 
                    [y] => 1 
) 
    [1] => Array ( 
                    [x] => 210 
                    [y] => 1 
 ) 
    [2] => Array ( 
                    [x] => 440 
                    [y] => 1 
 ) 
    [3] => Array ( 
                    [x] => 210 
                    [y] => 2 
 ) 
    [4] => Array ( 
                    [x] => 0 
                    [y] => 2 
 ) 
    )

我已经使用rsort

对值y进行了排序
rsort($packagesinf, 'my_sortY');
print_r($packagesinf);  

function my_sortY($a, $b)
{
    if ($a->y> $b->y) {
        return -1;
    } else if ($a->y< $b->y) {
        return 1;
    } else {
        return 0; 
    }
}

我会按每个不同的Y排序,X值按升序排列。就我而言,它将是:[0]>[1]>[2]>[4]>[3]

你知道怎么做,考虑到优先级先是Y然后是X?

编辑:所以现在我根据提出的解决方案修改了代码:

    function my_sortYX($a, $b)
    {
        if ($a->y > $b->y) {
            return 1;
        } else if ($a->y < $b->y) {
            return -1;
        } else {
            if ($a->x > $b->x) {
                return 1;
            } else if ($a->x < $b->x) {
                return -1;
            } else {
                return 0; 
            }
        }
    }

    function sortByY($a, $b) {

        return $a['y'] - $b['y'];
    }

     echo json_encode($packagesinf);
     echo nl2br("\n");
     echo nl2br("\n");

     echo 'my_sortYX';
     echo nl2br("\n");
     usort($packagesinf, 'my_sortYX');
     echo json_encode($packagesinf);
     echo nl2br("\n");
     echo nl2br("\n");


     echo 'sortByY';
     echo nl2br("\n");
     usort($packagesinf, 'sortByY');
     echo json_encode($packagesinf);
     echo nl2br("\n");
     echo nl2br("\n");

现在正在使用sortByY函数对Y进行正确排序,但是我仍然面临同样的排序问题...

这是我从回声中得到的:

[{"x":0,"y":1},{"x":210,"y":1},{"x":440,"y":1},{"x":210,"y":2},{"x":0,"y":2},{"x":30,"y":3},{"x":420,"y":1}]

my_sortYX
[{"x":30,"y":3},{"x":420,"y":1},{"x":0,"y":2},{"x":210,"y":2},{"x":210,"y":1},{"x":440,"y":1},{"x":0,"y":1}]

sortByY
[{"x":440,"y":1},{"x":0,"y":1},{"x":420,"y":1},{"x":210,"y":1},{"x":210,"y":2},{"x":0,"y":2},{"x":30,"y":3}]

所以my_sortYX仍然无法正常工作,只有sortByY ......

2 个答案:

答案 0 :(得分:1)

你试过这个吗?

    function my_sortYX($a, $b)
    {
        if ($a->y > $b->y) {
            return -1;
        } else if ($a->y < $b->y) {
            return 1;
        } else {
            if ($a->x > $b->x) {
                return -1;
            } else if ($a->x < $b->x) {
                return 1;
            } else {
                return 0; 
            }
        }
    }

编辑1 固定的返回值标志 编辑2 修复了组件引用:将$a->x替换为$a[x]等。

    function my_sortYX($a, $b)
    {
        if ($a[y] > $b[y]) {
            return 1;
        } else if ($a[y] < $b[y]) {
            return -1;
        } else {
            if ($a[x] > $b[x]) {
                return 1;
            } else if ($a[x] < $b[x]) {
                return -1;
            } else {
                return 0; 
            }
        }
    }

编辑2 续 可能你可以删除所有else - s,因为return之后if-else之后无法再继续执行......

    function my_sortYX($a, $b)
    {
        if ($a[y] > $b[y])
            return 1;
        if ($a[y] < $b[y])
            return -1;

        if ($a[x] > $b[x])
            return 1;
        if ($a[x] < $b[x])
            return -1;

        return 0; 
    }

答案 1 :(得分:1)

正如Mark Ba​​ker所说,使用usort()代替rsort。

除此之外,以下代码应该有效(未经测试):

usort($packagesinf, 'my_sortY');
print_r($packagesinf);  

function my_sortY($a, $b)
{
    if ($a->y> $b->y) {
        return -1;
    } else if ($a->y< $b->y) {
        return 1;
    } else {
        if ($a->x> $b->x) {
            return -1;
        } else if ($a->x< $b->x) {
            return 1;
        } else {
            return 0; 
        }
    }
}