2012-10-14 146 views
0

我有一個由註釋組成的表。其中一些是對其他評論的回覆,並在parent_commentid表中設置了一個值。我試圖創建一個函數,檢查結果集中的每個元素,如果parent_columnid中存在一個值,並且如果是這樣,則獲取整個元素並使用與該元素中的parent_commentid匹配的comment_id對元素進行排序迭代。這是我到目前爲止所提出的。PHP排序數組函數

function sort_comments($comments){ 
    $result = array(); 
    foreach($comments as $comment){ 
     if(is_null($comment['parent_commentid'])) $result[] = $comment; 
     else{ 
      $parent_comment = array_search($comment['parent_commentid'], $comments); 
      if($parent_array !== false) $result[$parent_comment][] = $comment; 
     } 
    } 
} 

array_search是不是我正在尋找的功能,但是我能想到的closet事情。我不知道該從哪裏出發。請記住,可以存在對其他答覆的答覆。

+0

我很困惑你的意思是「元素」。你在談論評論,那麼元素是什麼? –

+0

順便說一句。在第七行是一個「!==」運算符,它應該是「!=」。 – tamasgal

+0

我也很困惑。爲什麼不能array_search工作?評論ID是如何存儲的,它們是逗號分隔的嗎? –

回答

0

您需要通過自己的ID來存儲的意見,這樣你可以在以後引用它們:

function sort_comments($comments){ 
    $result = array(); 
    foreach($comments as $comment){ 
     if(is_null($comment['parent_commentid'])){ 
      $result[$comment['commentid']] = $comment; 
     }else{ 
      $parent_comment = $result[$comment['parent_commentid']] 
      if($parent_comment) 
       $parent_comment[$comment['commentid']] = $comment; 
      else 
       // what happens in this case: 
       // parent_commentid set, but no such comment exists? 
     } 
    } 

注意$comment['commentid']。我不知道你怎麼稱呼評論的編號(commentid?),但是因爲你有一列parent_commandid你很可能有這樣的專欄來引用你的評論。用它來存儲評論,頂層或其他評論。

+0

這似乎無法處理創建或排序無限嵌套的討論表示,它只會將parent_commentid列的值複製到另一個平面數組中。只是因爲這是他開始的路徑並不意味着繼續他的代碼將導致期望的結果:/ –

+0

@DanGrossman:那是真的,沒有理解這樣的問題。讓我們來看看... – arkascha

0

要按數組的內部字段排序,我通常使用usort。 Usort可以用作遞歸方法,因此您可以確保每次嘗試排序數組中的元素時都會調用您的自定義函數。通過這種方式,您將獲得更乾淨的代碼。

下面是一個例子:

function cmp_rand_score($a, $b) 
{ 
    if($a["rand_score"] == $b["rand_score"]){ 
    return 0; 
    } 
    return ($a["rand_score"] < $b["rand_score"]) ? 1 : -1; 
} 

//If you are inside a class: 
usort($rows, array($this, "cmp_rand_score")); 

//If not you can call directly: 
usort($rows, "cmp_rand_score"); 

希望它能幫助。