PHP / MySQL排序多维数组

时间:2015-04-19 14:12:18

标签: php mysql arrays sorting

我正在尝试将数组排序为三深数组。这是我目前的查询:

SELECT * FROM question 
INNER JOIN category ON question.category_id = category.id
INNER JOIN difficulty ON question.difficulty_id = difficulty.id 

预期结果如下:

array(
    '1' => array( // category id 1
        '1' => array( // difficulty id 1
            '1' => array('...'), // question id 1
            '2' => array('...') // question id 2
        ),
        '2' => array(
            '3' => array('...'),
            '4' => array('...')
        )
    )
)

我确实有以下内容:

foreach($categories as $category) {
    foreach($difficulties as $difficulty) {
        foreach($questions as $question) {
            if ($question['category_id'] == $category['id'] && $question['difficulty_id'] == $difficulty['id']) {
                $feed[$category['id']][$difficulty['id']][$question['id']] = $question;
            }
        }
    }
}

但是会有10,000多个问题并且性能会很差,所以有没有办法用一个查询和更少的循环来做到这一点?

1 个答案:

答案 0 :(得分:2)

基本上你可以像这样返回你的查询和顺序 ids:

Category_ID      Difficulty_ID      Question_ID
     0                0                 0
     0                0                 1
     1                0                 2
     1                3                 3
     1                3                 4
     2                0                 5
     2                1                 6

然后解析所有内容:

  1. 每次category_ID更改时添加一个空难度的新类别并重置之前的难度
  2. 每次难度变化都会为带有空问题的类别添加新难度
  3. 每次都将问题添加到当前难度中。
  4. 将此结构按性能存储在本地存储中:

    1. 定义一个唯一的分隔符(注意:IE不支持控制字符,这也意味着你不能存储二进制数据而不进行编码,例如base64)
    2. 像这样加载每个表的每一行:

      key: unique table prefix + id
      value: columns (delimited with the delimiter defined before)
      

      一次返回整个表的最简单方法是定义第二个分隔符,然后以下列形式进行一些稍微丑陋的查询:

      SELECT id||delimiter||col1||delimiter||...||colN FROM ...
      

      然后使用第二个分隔符(mysql中的group_concat())将所有内容与列表聚合放在一起。

    3. 有时您需要地图(对于N到M的关系,或者如果您想按难度或类别搜索问题),但因为每个问题只有一个类别和难度,您已经完成了。

      < / LI>

      替代

      如果数据不是太大而且在登录后没有变化,那么你可以使用应用程序缓存并在脚本标签中回显你的东西。