2012-10-14 185 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"); 

希望它能帮助。