2016-03-08 88 views
-1

我有排序爲陣列如下:雙分選陣列用PHP

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"); 

現在被正確分類爲Y及其功能sortByY,但我仍然面臨着同樣的問題:還分揀X ...

這是我從收到迴音:

[{"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

[rsort()](http://www.php.net/manual/en/function.rsort.php)沒有按」不要回調參數;也許你打算使用[usort()](http://www.php.net/manual/en/function.usort.php)代替 –

+1

並回答你的問題,替換'} else { return 0;' 'else else if($ a-> x> $ b-> z){return -1; } else if($ a-> x < $b-> z){return -1; } else {return 0; }' –

+0

完全正確@MarkBaker! – Alvaro

回答

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; 
      } 
     } 
    } 

EDIT 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; 
    } 
+0

我一直在測試所有的功能,我意識到my_sortY也不工作。我想出了這個:'function sortByY($ a,$ b){ return $ a ['y'] - $ b ['y']; }'現在它正確地按Y排序,但在 – Alvaro

+0

之後,我仍然有類似的問題排序。可能你只需要用'return -1'返回'return 1' - 表達式'$ a ['y'] - $ b ['y']'如果'$ a'項目的y'屬性小於'$ b'的值,並且您使用'>',大於運算符,則值爲負值。我相應地更改我的代碼版本。 – CiaPan

+0

謝謝@CiaPan,我還在努力,但我無法設法用你的功能進行排序,我更新了問題以獲得更多細節! – Alvaro

1

正如馬克Baker說,使用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; 
     } 
    } 
}