2010-02-18 74 views
1

我沒看usort,但還是有點迷茫......在php中使用usort來排序對象數組?

這裏是$ myObject的對象是什麼樣子:

Array 
(
    [0] => stdClass Object 
     (
      [tid] => 13 
      [vid] => 4 
     ) 

    [1] => stdClass Object 
     (
      [tid] => 10 
      [vid] => 4 
     ) 

    [2] => stdClass Object 
     (
      [tid] => 34 
      [vid] => 4 
     ) 

    [3] => stdClass Object 
     (
      [tid] => 9 
      [vid] => 4 
     ) 

我看到這一點:

function cmp($a, $b) 
{ 
    if( $a->weight == $b->weight){ return 0 ; } 
    return ($a->weight < $b->weight) ? -1 : 1; 
} 
usort($myobject,'cmp'); 

我試圖根據tid進行排序,但是,我想我只是不確定是否必須改變重量到某些東西?或者它會按原樣工作?我試過了,但沒有輸出...

回答

6

cmp是一個回調函數,usort用來比較複雜的對象(如你的)來弄清楚如何排序它們。修改CMP供您使用(或者其重命名爲您所希望的任何)

function cmp($a, $b) 
{ 
    if( $a->tid == $b->tid){ return 0 ; } 
    return ($a->tid < $b->tid) ? -1 : 1; 
} 
usort($myobject,'cmp'); 

function sort_by_tid($a, $b) 
{ 
    if( $a->tid == $b->tid){ return 0 ; } 
    return ($a->tid < $b->tid) ? -1 : 1; 
} 
usort($myobject,'sort_by_tid'); 

http://www.php.net/usort

+0

好,感謝解釋,但它仍然沒有工作...我不允許將它分配給變量或其他東西嗎?因爲當我做$ myobject = usort($ myobject,'cmp')時,它根本不輸出任何內容?我假設我只需要一個或上面的其他功能,而不是兩個,因爲他們都做同樣的事情? – andy787899 2010-02-18 06:05:06

+0

此外,我也嘗試將兩個變量重命名爲$ myobject1和$ myobject2 = usort ...但這也不起作用... – andy787899 2010-02-18 06:06:01

+0

沒關係!應該只是嘗試不發佈之前發佈......謝謝! – andy787899 2010-02-18 06:09:18

0

我一直想寫一個比較函數了三個小時。事實上這很容易,但是我認爲我錯過了一些東西,並且通過很多方式從頭開始改變算法一次又一次地寫下來,用我的樣本數組對其進行測試。

最後我意識到問題在於內部的uasort函數。它並沒有完成與所有項目比較。我現在不記得使用過的算法的名字,但是我自己在C++中使用了一個改進版本(ow我的)。該算法使用類似二元樹的比較方法,通過將數組劃分爲每次需要遞歸調用具有新索引(下限,上限)的排序函數的對數。

當剩餘片是一個項目,然後上下指標是一樣的,功能認爲它已經完成(處理所有項目),雖然最後一個項目未評價。當最內層的塊具有奇數時,使用該算法對函數進行排序失敗。它工作正常2,4,8 ....元素,但不能與3,5,7等工作...失敗的確切條件取決於元素排序順序。數字並不總是有意義的。

幾年前我解決了這個問題。我現在無法自己解決PHP問題,因爲我沒有PHP編譯器,也沒有PHP源代碼。但是如果有任何來自PHP開發團隊的人與我聯繫,我可以用C++提供該算法的工作副本。相同的算法是訪問排序元素的最快方式。

0

爲了獲得財產stdClass的對象使用的操作 - > { 'name_property'},如:$ A - > { 'TID'}

function cmp($a, $b) 
{ 
    if( $a->{'tid'} == $b->{'tid'}){ return 0 ; } 
    return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1; 
} 
usort($myobject,'cmp'); 

function sort_by_tid($a, $b) 
{ 
    if( $a->{'tid'} == $b->{'tid'}){ return 0 ; } 
    return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1; 
} 
usort($myobject,'sort_by_tid');