Php 排序多维数组一次显示一个数组中的值

Php 排序多维数组一次显示一个数组中的值,php,mysql,arrays,codeigniter,codeigniter-3,Php,Mysql,Arrays,Codeigniter,Codeigniter 3,我有一个由两个合并数组组成的数组,我使用array\u multisort()对其进行了排序。问题在于,它似乎是一次显示一个数组中的ind数据,而我需要它根据两个独立键的高低值来显示数据 现在看起来像这样 [ Topic posted 10 minutes ago ] [ Topic posted 20 minutes ago ] [ Topic posted 30 minutes ago ] [ Reply by user, 10 minutes ago ] [ Reply by user,

我有一个由两个合并数组组成的数组,我使用
array\u multisort()
对其进行了排序。问题在于,它似乎是一次显示一个数组中的ind数据,而我需要它根据两个独立键的高低值来显示数据

现在看起来像这样

[ Topic posted 10 minutes ago ]
[ Topic posted 20 minutes ago ]
[ Topic posted 30 minutes ago ]
[ Reply by user, 10 minutes ago ]
[ Reply by user,  20 minutes ago ]
[ Reply by user,  30 minutes ago ]
实际上,我需要按此顺序显示它

[ Topic posted 10 minutes ago ]
[ Reply by user, 10 minutes ago ]
[ Topic posted 20 minutes ago ]
[ Reply by user, 20 minutes ago ]
[ Topic posted 30 minutes ago ]
[ Reply by user, 30 minutes ago ]
如何做到这一点

以下是我的PHP代码:

$topics = $this->db->select("*")
    ->order_by("id", "desc")
    ->limit(10)
    ->get("forum_topics")
    ->result();

$replies = $this->db->select("*")
    ->order_by("id", "desc")
    ->limit(10)
    ->get("forum_topics_replies")
    ->result();

$merged = array_merge($topics, $replies);

$sort = array();
foreach($merged as $k => $v) {
    $sort['reply_date'][$k] = $v;
    $sort['topic_date_made'][$k] = $v;
}

array_multisort($sort['topic_date_made'], SORT_DESC, $sort['reply_date'], SORT_DESC, $merged);

return $merged;
编辑: 如果使用连接查询,如何实现

$topics = $this->db->select("*")
 ->from("forum_topics")
 ->limit($limit)
 ->join('forum_topics_replies', 'forum_topics.id = forum_topics_replies.id')
 ->order_by("forum_topics.id", "desc")
 ->order_by("forum_topics_replies.id", "desc")
 ->get()
 ->result();
编辑2: 我需要能够使用以下字段:

主题表:
topic\u name
id
parent
topic\u date\u made

回复表:
parent
author
reply\u date
id

您可以尝试添加
forum\u topic\u id
id
forum\u topics
forum\u topics\u repress>表之间的公共表列/字段

更新1:

要使array_multisort正常工作,每个数组的数组键必须相同。看起来,由于数据来自不同的表,而您只是在合并它们,所以无法工作

因此,您可以尝试内部联接,联接这两个表,这将为$merged生成完全相同数量的数组键,或者您可以手动按摩两个结果数组以获得所需的$merged数组

更新2:


请尝试上面的方法。

我认为工会声明可以解决您的问题-这个怎么样

$query = $this->db->query('
    SELECT id, 1 as is_topic, parent, "" as author, topic_name, "Topic posted" AS praefix, topic_made_date as union_date FROM forum_topics
    UNION
    SELECT id, 0 as is_topic, parent, author, "" as topic_name, "Reply by user" AS praefix, reply_date as union_date FROM forum_topics_replies
    ORDER BY union_date DESC
    LIMIT 0,10
');

您需要使用Join QUERY我认为联合可以解决您的问题,因为我发布了两个表的ID字段都被称为just
ID
。不过没什么区别。我将代码改为按“id”排序,而不是按“论坛主题id”。我第一次尝试时将其改为按
id
排序,这就是我的意思。这对订单没有影响。哦,好的。可以请您使用var_dump$merged只需几行就可以了解返回的数据。好的,谢谢。我已经更新了我的答案,我希望它能帮上忙。我不太确定该怎么做。我只是返回这个查询的结果吗?
$query->result()
返回您想要的所有值。它的工作原理类似于
get()->result()
-如果执行这个语句,您将看到您得到的结果;)我尝试了这个,当我选择*作为t1时,似乎从MySQL中得到了语法错误,我做错了吗?我认为我的精确查询应该可以完成这项工作-你需要一个日期和标题
主题发布
用户回复
-你不需要
*
语法,是的,我明白了。不过,当我稍后在数组中循环时,我需要使用更多字段-日期还不够。我将如何实现这一目标?
$topics = $this->db->select("forum_topics.id as topic_id, *")
 ->from("forum_topics")
 ->limit($limit)
 ->join('forum_topics_replies', 'forum_topics.id = forum_topics_replies.id')
 ->order_by("forum_topics.id", "desc")
 ->order_by("forum_topics_replies.id", "desc")
 ->get()
 ->result();

    $sort = array();
    foreach($topics as $k => $v) {
        $sort['topic_id'][$k] = $v;
        $sort['reply_date'][$k] = $v;
        $sort['topic_date_made'][$k] = $v;
    }

    array_multisort($sort['topic_id'], SORT_DESC, $sort['topic_date_made'], SORT_DESC, $sort['reply_date'], SORT_DESC, $topics);
$query = $this->db->query('
    SELECT id, 1 as is_topic, parent, "" as author, topic_name, "Topic posted" AS praefix, topic_made_date as union_date FROM forum_topics
    UNION
    SELECT id, 0 as is_topic, parent, author, "" as topic_name, "Reply by user" AS praefix, reply_date as union_date FROM forum_topics_replies
    ORDER BY union_date DESC
    LIMIT 0,10
');