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字段都被称为justID
。不过没什么区别。我将代码改为按“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
');