如何基于公共密钥在PHP中组合两个数组?

时间:2010-03-22 12:59:42

标签: php arrays

我正在尝试基于entry_id键将两个关联数组连接在一起。两个数组都来自单独的数据库资源,第一个存储条目标题,第二个存储条目作者,key =>值对如下:

array (
    'entry_id' => 1,
    'title' => 'Test Entry'
)   

array (
    'entry_id' => 1,
    'author_id' => 2

我正在尝试实现类似的数组结构:

array (
    'entry_id' => 1,
    'author_id' => 2,
    'title' => 'Test Entry'
)

目前,我已经通过循环遍历每个数组并按照我想要的方式格式化数组来解决问题,但我认为这有点像记忆。

$entriesArray = array();
foreach ($entryNames as $names) {
    foreach ($entryAuthors as $authors) {
        if ($names['entry_id'] === $authors['entry_id']) {
            $entriesArray[] = array(
                'id' => $names['entry_id'],
                'title' => $names['title'],
                'author_id' => $authors['author_id']
            );                          
        }
    }
}

我想知道这样做是否有更容易,内存更少的方法?

4 个答案:

答案 0 :(得分:2)

是否有可能在用于从数据库中检索信息的SQL中执行JOIN而不是在多个查询中获取数据?在数据库级别这样做会更快更整洁。

根据您的数据库结构,您可能希望使用类似于

的内容
SELECT entry_id, title, author_id
FROM exp_weblog_data
INNER JOIN exp_weblog_titles
ON exp_weblog_data.entry_id = exp_weblog_titles.entry_id
WHERE field_id_53 = "%s" AND WHERE entry_id IN ("%s")

Wikipedia has a bit on each type of join

否则最好的选择可能是重构第一个数组,使其成为title_id到标题的映射

所以:

array(
    array(
       'entry_id' => 1,
       'title' => 'Test Entry 1',
    ),
    array(
       'entry_id' => 3,
       'title' => 'Test Entry 2',
    ),
)

会变成:

array(
    1 => 'Test Entry 1',
    3 => 'Test Entry 2',
)

这意味着合并数组所需的代码简化为:

$entriesArray = array();
foreach ($entryAuthors as $authors) {
    $entriesArray[] = array(
        'id' => $authors['entry_id'],
        'title' => $entryNames[$authors['entry_id']],
        'author_id' => $authors['author_id']
    );                           
}

答案 1 :(得分:1)

我重新安排了一些代码以允许单个SQL查询,如下所示:

$sql = sprintf('SELECT DISTINCT wd.field_id_5, wd.entry_id, mb.email, mb.screen_name 
            FROM `exp_weblog_data` wd
            INNER JOIN `exp_weblog_titles` wt
            ON wt.entry_id=wd.entry_id
            INNER JOIN `exp_members` mb
            ON mb.member_id=wt.author_id
            WHERE mb.member_id IN ("%s")
            AND wd.entry_id IN ("%s")',
            join('","', array_unique($authors)),
            join('","', array_unique($ids))
);

这很好地解决了我的问题,即使我正在进行另一次SQL调用。谢谢你的尝试。

答案 2 :(得分:0)

在回复你对Yacoby帖子的评论时,这个SQL会不会给你输出的输出?

SELECT exp_weblog_data.entry_id, exp_weblog_data.field_id_5 AS title_ie, exp_weblog_titles.author_id 
FROM exp_weblog_data LEFT JOIN exp_weblog_titles 
ON exp_weblog_data.entry_id = exp_weblog_titles.entry_id 
WHERE exp_weblog_data.field_id_53 = "%S"

exp_weblog_data中的每个条目,其中field_id_53 =“%S”将与exp_weblog_titles中的任何匹配作者联接,如果条目具有多个作者,则将返回两行或更多行。

答案 3 :(得分:-1)