【问题标题】:PHP - Combine sub-arrays and sort by value?PHP - 组合子数组并按值排序?
【发布时间】:2011-04-14 18:39:10
【问题描述】:

这就是我现在得到的:

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

有什么想法吗?

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

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

【问题讨论】:

标签: php arrays sorting


【解决方案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 将包含按日期降序排列的帖子,例如最新日期优先。如果您想改用usort,可以使用compare 函数中的代码。不过,顺序将是升序的。

【讨论】:

  • 我不确定,但您不需要另一个嵌套的 for 循环来完成这项工作吗?
  • @DonK 谢谢,基本上我的答案在更正后大致相同,所以我删除了重复的部分。
【解决方案2】:

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

大致:

  1. 对输入数组进行排序(可选)
  2. 扫描输入数组中的最小值,将该值复制到新数组中,然后从输入数组中删除该值。
  3. 重复直到所有输入数组都为空。

当然,如果您根本不关心性能,您可以简单地组合所有数组,然后对其进行排序。

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

@Don Kirkby:确实:它基本上是一个mergesort,但它只适用于已经排序的数组。如果它们都未排序,则最好将它们组合并改用快速排序。

【讨论】:

  • 如果初始数组未排序,在组合之前排序是否更快?我不这么认为,而且代码肯定更简单组合,然后排序。
【解决方案3】:

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

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

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

【讨论】:

  • array_merge 函数正是我想要的。我在发布之前尝试过它,但我没有让它工作。我忘了在循环之前使 $result 成为一个数组。不过,这种排序似乎更棘手。如果它包含字符和数字,真的可以排序吗?谢谢你的帖子! :)
  • @Nike,你的意思是你的日期是字符串格式,而不是日期对象?如果是这样,您可以使用strptime 函数来解析它们。您可以在传递给usort 的用户定义比较函数中执行此操作,或者在排序之前将所有字符串替换为日期对象。
  • 抱歉回复晚了。是的,日期是字符串格式,但我将其更改为 unix 时间戳,现在运行良好。按数字对数组进行排序要容易得多,然后以人类日期格式打印出日期供用户阅读。非常感谢,如果没有您的帮助,这将需要数周时间。 :)
  • 很高兴为您提供帮助,@Nike,欢迎来到 Stack Overflow。由于您是新手,您可能没有注意到问题的每个答案旁边的大复选标记。您可以单击它以表明您已接受最有帮助的答案。它还给回答的人打了几分。
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多