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

时间:2010-09-20 16:10:55

标签: php arrays sorting

这就是我现在所拥有的:

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
                )

        )

)

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

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
        )
)

有什么想法吗?

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

编辑:我还应该提一下,arrayitems的数量并不总是相同的。

3 个答案:

答案 0 :(得分:3)

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

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

最后,您可以使用user defined sort函数对整个事物进行排序。

答案 1 :(得分:1)

Don Kirby的解决方案的替代方案是使用SplMaxHeap,这将允许您一次迭代和排序:

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

$postHeap将按降序日期顺序包含帖子,例如最新的约会。如果您想使用compare,可以使用usort函数中的代码。然而,订单将会升序。

答案 2 :(得分:0)

你有两个阵列吗?或者更多?他们已经排序了吗?如果是这样,您可以使用它来更有效地组合它们。如果没有,您可能需要先对它们进行排序。

大致是:

  1. 对输入数组进行排序(可选)
  2. 扫描输入数组以获取最低值,将该值复制到新数组中,从输入数组中删除该值。
  3. 重复,直到所有输入数组都为空。
  4. 当然,如果你根本不关心性能,你可以简单地组合所有数组然后对它进行排序。

    对于排序,您可能需要使用:http://www.php.net/manual/en/function.sort.php#99700

    @Don Kirkby:的确如此:它基本上是mergesort,但它只适用于已排序的数组。如果他们都没有被排序,你可能最好将它们组合起来并使用quicksort。