如果第二个表的结果存在,则向PHP中的数组添加数组

我试图通过显示一些术语的定义(如果存在定义)来扩展我正在构建的字典的功能。

我从两张表中获取数据如下:

    $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " .
            "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ".
            "WHERE ".DICTIONARY_TABLE.".".$source." LIKE '%".$keyword."%' ".
            "AND ".DICTIONARY_TABLE.".theme_id = ".$selected_theme_id." ".
            "ORDER BY ".DICTIONARY_TABLE.".id");

之后,在while循环中,我首先从另一个表中获取主题名称,然后将查询结果添加到数组中:

        while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    // get theme name
    $theme_name = "theme_".$lang;
    $theme_query= $db->query("SELECT theme_id,".$theme_name." FROM ".DICTIONARY_THEMES." WHERE theme_id = ".$theme_id."");
    $theme_row  = $theme_query->fetch(PDO::FETCH_ASSOC);
    $theme      = $theme_row[$theme_name];

    // add all results to an array
    $results[] = array(
        'english'           => $row['english'],
        'bulgarian'         => $row['bulgarian'],
        'english_abbr'      => $row['english_abbr'],
        'bulgarian_abbr'    => $row['bulgarian_abbr'],
        'theme'             => $theme
    );

之后,我尝试检查LEFT JOIN是否实际返回了定义表中的任何结果,如果是,请将它们添加到数组中 - 但这是我失败的地方...

    // check if definition exists for this term
    if(isset($row['bulgarian_definition'])) {
        array_push($results['bulgarian_definition'], $row['bulgarian_definition']);
    }
    if(isset($row['english_definition'])) {
        array_push($results['english_definition'], $row['english_definition']);
    }

我尝试了所有可以找到的方法,首先检查变量是否已被定义,然后将它们推送到$results数组。 什么都没有

我似乎无法成功找到english_definition和/或bulgarian_definition已设置。 当我在PhpMyAdmin中运行查询本身时,它工作得很好。

我能想到的唯一“解决方案”是放弃为定义提供单独表格的想法,只是扩展主表格,但这不是我知道的一个好方法。 任何有关我在做什么错误的见解将不胜感激。 谢谢!

编辑:我已经改变了元素添加到数组的方式:

    // check if definition exists for this term
    if(isset($row['bulgarian_definition'])) {
        $results['bulgarian_definition'] = $row['bulgarian_definition'];
    }
    if(isset($row['english_definition'])) {
        $results['english_definition'] = $row['english_definition'];
    }

现在这个诀窍。 当我在while循环外部转储$results数组while ,两个定义都已添加。

然而,我现在得到了大量的Warning: Illegal string offset 'theme' in...和'英语'和'保加利亚语'中的Warning: Illegal string offset 'theme' in... - 这发生在下面,当我在foreach循环中运行$ results数组以开始打印它们时:

    foreach($results as $result) {

    if($theme != $result['theme']) {
        $theme = $result['theme'];
        $search_results .= "<h3>" . $result['theme'] . "</h3>";
    }

    if($source == "english") {
        foreach ($keywords as $keyword) {
            $result['english'] = preg_replace("|($keyword)|Ui", "<span style="color:#780223">" . $keyword . "</span>", $result['english']);
        }

不知道为什么会发生这种情况,将继续寻找。

第二次编辑:决定将两个定义直接放在$ results数组中,如下所示:

    while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    // get theme name
    $theme_name = "theme_".$lang;
    $theme_query= $db->query("SELECT theme_id,".$theme_name." FROM ".DICTIONARY_THEMES." WHERE theme_id = ".$theme_id."");
    $theme_row  = $theme_query->fetch(PDO::FETCH_ASSOC);
    $theme      = $theme_row[$theme_name];

    // add all results to an array
    $results[] = array(
        'english'           => $row['english'],
        'bulgarian'         => $row['bulgarian'],
        'english_abbr'      => $row['english_abbr'],
        'bulgarian_abbr'    => $row['bulgarian_abbr'],
        'theme'             => $theme,
        'bulgarian_definition'  => $row['bulgarian_definition'],
        'english_definition'    => $row['english_definition']
    );  
}// end while

这现在工作得很好。 当我转储数组时,如果没有定义存在,我有'english_definition' => null ,如果存在定义,它就在那里。 到现在为止还挺好。

新的问题是,我不能再按主题对结果进行分组 - 显示找到的最后结果的主题。 这是完全不同的问题。 真让人厌烦的是,在我添加定义之前,一切都很顺利。 你可以在这里工作的网站。

问题解决了!

  • 决定不要将值推入数组(如上所示)。
  • 在获得主题名称的while循环中摆脱了额外的查询,而是将其移到执行搜索的查询中。 因此查询本身是:

                    $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " .
            "JOIN ".DICTIONARY_THEMES." ON ".DICTIONARY_TABLE.".theme_id = ".DICTIONARY_THEMES.".theme_id ".
            "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ".
            "WHERE ".DICTIONARY_TABLE.".".$source." LIKE '%".$keyword."%' ".
            "ORDER BY ".DICTIONARY_TABLE.".theme_id, ".DICTIONARY_TABLE.".id");
    
  • while循环是:

        while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    
        $theme_name = "theme_".$lang;
    
        // add all results to an array
        $results[] = array(
            'english'           => $row['english'],
            'bulgarian'         => $row['bulgarian'],
            'english_abbr'      => $row['english_abbr'],
            'bulgarian_abbr'    => $row['bulgarian_abbr'],
            'theme'             => $row[$theme_name],
            'bulgarian_definition'  => $row['bulgarian_definition'],
            'english_definition'    => $row['english_definition']
        );  
    }// end while
    

    上面的网站链接现在将加载升级后的搜索功能,其中将显示定义(如果存在)。 对于任何人都好奇的一个例子是“蠕虫”。

    事实证明,有时解决问题所需的一切就是向人们展示,然后开始思考,因为有时候解决方案就在你面前。 感谢所有参与了的人!


    编辑:删除以前的答案,因为它是不正确的。 一旦我有问题的解决方案,将更新此答案。 还没有删除这个答案,因为我没有找到这样做的选项。 尽管占用空间有时很有趣,并且感觉很重要:),不要讨厌玩家,讨厌游戏。


    链接地址: http://www.djcxy.com/p/59417.html

    上一篇: LEFT JOIN, add to array in PHP if results from second table exist

    下一篇: push and in