PHP排序数组函数

PHP排序数组函数,php,Php,我有一个由注释组成的表。其中一些是对其他注释的回复,并在parent_commentid表中设置了一个值。我正在尝试创建一个函数,用于检查结果集中的每个元素是否在parent_columnid中有值,如果有,则获取整个元素,并在元素内部使用与迭代中当前元素的parent_commentid匹配的comment_id对其进行排序。这就是我到目前为止想到的 function sort_comments($comments){ $result = array(); foreac

我有一个由注释组成的表。其中一些是对其他注释的回复,并在parent_commentid表中设置了一个值。我正在尝试创建一个函数,用于检查结果集中的每个元素是否在parent_columnid中有值,如果有,则获取整个元素,并在元素内部使用与迭代中当前元素的parent_commentid匹配的comment_id对其进行排序。这就是我到目前为止想到的

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

数组搜索不是我想要的功能,而是我能想到的壁橱。我不知道从这里到哪里去。还请记住,可能存在对其他回复的回复。

您需要按自己的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']
。我不知道如何调用注释的id(
commentid
?),但由于您有一个列
parent\u commandid
,您很可能有这样一个列来引用您的注释。使用它将注释存储在顶层或其他注释中

要按数组的内部字段排序,我通常使用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");
函数cmp\u rand\u分数($a,$b)
{
如果($a[“随机分数”]=$b[“随机分数”]){
返回0;
}
回报($a[“兰特分数”]<$b[“兰特分数”])?1:-1;
}
//如果您在一个类中:
usort($rows,array($this,“cmp_rand_score”);
//如果没有,您可以直接致电:
usort($rows,“cmp_rand_分数”);

希望有帮助。

我不明白你所说的“元素”是什么意思。你说的是评论,那么元素是什么?顺便说一句。第7行是“!==”
操作符,应该是“!=”。我也很困惑。为什么数组搜索不起作用?注释ID是如何存储的,它们是逗号分隔的吗?首先,创建分层数组,其中注释是其父级的子数组,正如您开始所做的那样。然后需要编写一个递归函数。此函数将数组作为参数。对于数组中的每个项,如果该元素也是一个数组(具有子注释),则对该项调用相同的函数对子数组进行排序。然后,按您希望按哪个列对注释排序,对当前数组进行排序。结果将是一个排序的层次数组。你能给我一个简单的例子吗?递归函数是指当函数调用自身时,对吗?是的,通过一个适用于我尝试做的事情的简单演示,这将非常有用。这似乎无法处理创建或排序具有无限嵌套的讨论的表示形式,它只会将parent_commentid列的值复制到另一个平面数组中。仅仅因为这是他开始的路径,并不意味着继续他的代码将导致期望的结果:/