PHP/MySQL排序多维数组

PHP/MySQL排序多维数组,php,mysql,arrays,sorting,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' => arra

我想把一个数组分成三个深度的数组。这是我当前的查询:

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

但是会有10000多个问题,性能会很差,所以有没有一种方法可以通过一个查询和更少的循环来实现这一点?

基本上,您只需返回查询并按ID排序,如下所示:

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
然后在一段时间内解析所有内容:

  • 每次类别ID更改时,添加一个难度为空的新类别,并重置以前的难度
  • 每一次难度的变化都会给有空问题的类别增加新的难度
  • 每次都把问题添加到当前的难度中
  • 要在本地存储中性能地存储此结构,请执行以下操作:
  • 定义一个唯一的分隔符(注意:IE不支持控制字符,这也意味着您不能在没有编码的情况下存储二进制数据,例如base64)
  • 按如下方式加载每个表的每一行:

    key: unique table prefix + id
    value: columns (delimited with the delimiter defined before)
    
    一次返回整个表的最简单方法是定义第二个分隔符,然后使用以下形式的稍微难看的查询:

    SELECT id||delimiter||col1||delimiter||...||colN FROM ...
    
    然后使用第二个分隔符(
    group\u concat()
    在mysql中)将其与列表聚合放在一起

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

  • 可供替代的
    如果数据不是太大,并且在登录后没有更改,那么您可以使用应用程序缓存并在脚本标记中回显您的内容。

    似乎不太可能需要将这三个表中的所有数据转储到php中进行处理。您可能应该在数据库中做更多的数据处理工作,而不是在php中。基本上,我的目标是实现所有按相关类别和困难排序的问题数据。那么,更新来得太晚了。什么目的?在本地存储中存储(通过ajax调用检索)用于脱机应用程序还是仅显示?这是一个ajax请求,然后我对数据集进行json编码并将其返回到我的应用程序以用于本地存储。好的,我添加了mysql特定信息以及如何在本地存储中构建结构,但我不擅长json