PHP-组合子数组并按值排序?

PHP-组合子数组并按值排序?,php,arrays,sorting,Php,Arrays,Sorting,这就是我现在得到的: Array ( [0] => Array ( [0] => Array ( [id] => 53 [date] => 18 Sep 2010 10:29 [user] => 52 [post] => y

这就是我现在得到的:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 53
                    [date] => 18 Sep 2010 10:29
                    [user] => 52
                    [post] => ytiuy
                )

            [1] => Array
                (
                    [id] => 55
                    [date] => 11 Sep 2010 11:14
                    [user] => 52
                    [post] => this is a test post :]
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [id] => 56
                    [date] => 4 Sep 2010 03:19
                    [user] => 55
                    [post] => pppost :DD:D:D:D
                )

        )

)
我想删除数组中的前两个“步骤”,然后按“日期”值对数组进行排序,如下所示:

Array
(
    [0] => Array
        (
            [id] => 56
            [date] => 4 Sep 2010 03:19
            [user] => 55
            [post] => pppost :DD:D:D:D
        )

    [1] => Array
        (
            [id] => 55
            [date] => 11 Sep 2010 11:14
            [user] => 52
            [post] => this is a test post :]
        )

    [2] => Array
        (
            [id] => 53
            [date] => 18 Sep 2010 10:29
            [user] => 52
            [post] => ytiuy
        )
)
有什么想法吗

非常感谢,感谢所有的帮助!:)


编辑:我还应该提到,数组项的数量并不总是相同的。

您有两个数组吗?还是更多?它们已经分类了吗?如果是这样的话,您可以使用它来更有效地组合它们。如果没有,您可能需要首先对它们进行排序

大致:

  • 对输入数组排序(可选)
  • 扫描输入数组中的最低值,将该值复制到新数组中,然后从输入数组中删除该值
  • 重复此操作,直到所有输入数组都为空
  • 当然,如果您根本不关心性能,您可以简单地组合所有阵列,然后进行排序

    对于排序,您可能需要使用:


    @唐·柯克比:的确:它基本上是一个数组,但它只适用于已经排序的数组。如果它们都未排序,则最好将它们合并并使用快速排序。

    您应该能够使用累加器模式和函数将所有较低级别的数组合并在一起

    $result = array();
    foreach ($oldarray as $child)
    {
        $result = array_merge($result, $child);
    }
    

    最后,您可以使用该函数对整个内容进行排序。

    Don Kirby解决方案的替代方案是使用一个允许您一次迭代和排序的函数:

    class PostHeap extends SplMaxHeap
    {
        public function compare($post, $other)
        {
            return strtotime($post['date']) - strtotime($other['date']);
        }
    }
    
    $postHeap = new PostHeap;
    foreach($posts as $subArray) {
        foreach($subArray as $post) {
            $postHeap->insert($post);
        }
    }
    

    然后,
    $postsheap
    将按日期降序包含帖子,例如最新日期优先。如果要改用
    usort
    ,可以在
    compare
    功能中使用代码。不过顺序会上升。

    我觉得,你的问题可以通过查看和来回答。我不确定,但你不需要另一个嵌套for循环来实现吗?@DonK谢谢,基本上我的答案在更正后大致相同,所以我删除了重复的部分。如果初始数组未排序,合并前的排序是否更快?我不这么认为,而且代码当然更容易组合,然后排序。array_merge函数正是我想要的。我在贴到这里之前试过了,但是没有成功。我忘记在循环之前将$result作为数组。不过,这类问题似乎更为棘手。如果它包含字符和数字,真的可以排序吗?谢谢你的帖子!:)@Nike,你是说你的日期是字符串格式,而不是日期对象?如果是这样,您可以使用
    strtime
    函数来解析它们。您可以在传递给
    usort
    的用户定义的比较函数中执行此操作,也可以在排序之前用日期对象替换所有字符串。很抱歉,响应太晚。是的,日期是字符串格式的,但我将其改为unix时间戳,现在它工作得很好。按数字对数组进行排序,然后以人工日期格式打印出日期,供电子用户阅读,要容易得多。非常感谢,如果没有你的帮助,可能需要几个星期的时间很高兴为您提供帮助,@Nike,欢迎使用Stack Overflow。因为你是新来的,你可能没有注意到你的问题的每个答案旁边都有一个大的复选标记。您可以单击该按钮,表示您已接受最有帮助的答案。它还为回答的人提供了几点建议。