简体   繁体   English

PHP数组从其他数组中选择结果

[英]PHP Array select result from other array

I have a sql table with some category, i get them in a array.. all fine but when i try to get data from another table foreach category, always return me for first category selected. 我有一个带有某些类别的sql表,我将它们放在数组中..都很好,但是当我尝试从另一个表foreach类别中获取数据时,总是返回我选择的第一个类别。

This is my code: 这是我的代码:

$gameguidecategoryes = array();
$gameguides = array();  


$dbselectgameguidecategoryes = new DB_MSSQL;
$dbselectgameguidecategoryes->Database=$newweb_db;
$dbselectgameguidecategoryes->query("Select GameGuideCatNr,GameGuideCatName_$languageid as GameGuideCatName,GameGuideCatImage from GameGuide_Category where GameGuideCatVisible = 1 order by GameGuideCatOrder asc");
for($i=0;$i < $dbselectgameguidecategoryes->num_rows();++$i) { 
    if ($dbselectgameguidecategoryes->next_record()){
        $GameGuideCatNr = $dbselectgameguidecategoryes->f('GameGuideCatNr');
        $GameGuideCatName = $dbselectgameguidecategoryes->f('GameGuideCatName');
        $GameGuideCatImage = $dbselectgameguidecategoryes->f('GameGuideCatImage');
    }
    $gameguidecategoryes_temp = array(
        'ggcname' => $GameGuideCatName,
        'ggcimg' => $GameGuideCatImage,
    );

    $gameguidecategoryes[$i] = $gameguidecategoryes_temp;

    $dbselectgameguide = new DB_MSSQL;
    $dbselectgameguide->Database=$newweb_db;
    $dbselectgameguide->query("Select GameGuideID,GameGuideName_$languageid as GameGuideName from GameGuide_Content where GameGuideCat = $GameGuideCatNr and GameGuideVisible = 1 order by GameGuideOrder asc");

    for($ii=0;$ii < $dbselectgameguide->num_rows();++$ii) {
        if ($dbselectgameguide->next_record()){
            $GameGuideID = $dbselectgameguide->f('GameGuideID');
            $GameGuideName = $dbselectgameguide->f('GameGuideName');
        }
        $gameguides_temp = array(
            'ggid' => $GameGuideID,
            'ggn' => $GameGuideName,
        );

        $gameguides[$ii] = $gameguides_temp;
    }
}

Why $gameguides return data only from first category? 为什么$ gameguides仅返回第一类的数据?

Thank you 谢谢

Better work on clean code 更好地编写干净代码

$gameguidecategoryes = $gameguides = $gameguidescategoryids = array();  

$dbselectgameguidecategoryes = new DB_MSSQL;
$dbselectgameguidecategoryes->Database=$newweb_db;
$dbselectgameguidecategoryes->query("Select GameGuideCatNr,GameGuideCatName_$languageid as GameGuideCatName,GameGuideCatImage from GameGuide_Category where GameGuideCatVisible = 1 order by GameGuideCatOrder asc");

while ($dbselectgameguidecategoryes->next_record()) {
    $gameguidescategoryids[] = $dbselectgameguidecategoryes->f('GameGuideCatNr');

    $gameguidecategoryes[] = array(
        'ggcname' => $dbselectgameguidecategoryes->f('GameGuideCatName'),
        'ggcimg' => $dbselectgameguidecategoryes->f('GameGuideCatImage'),
    );
}

if (count($gameguidescategoryids)) {
    $dbselectgameguide = new DB_MSSQL;
    $dbselectgameguide->Database=$newweb_db;
    $dbselectgameguide->query("Select GameGuideID,GameGuideName_$languageid as GameGuideName from GameGuide_Content where GameGuideCat IN (".implode(',', $gameguidescategoryids).") and GameGuideVisible = 1 order by GameGuideOrder asc");

    while ($dbselectgameguide->next_record()){
        $gameguides[] = array(
            'ggid' => $dbselectgameguide->f('GameGuideID'),
            'ggn' => $dbselectgameguide->f('GameGuideName'),
        );
    }
}

Your second loop keeps getting trashed by the first loop. 您的第二个循环不断被第一个循环所破坏。 eg Consider what happens: 例如,考虑发生了什么:

  1. You fetch your categories, and (let's pretend) there's 4 of them. 您获取类别,(假装)其中有4个类别。
  2. You store some information in $gameguidecategoryes[0] 您将一些信息存储在$gameguidecategoryes[0]
  3. You run the second query, get some content for category #0, say, 3 records 您运行第二个查询,获取类别0的一些内容,例如3条记录
  4. That gets stored in $gameguides[0] , [1] , [2] 那被存储在$gameguides[0][1][2]
  5. Your outer loop ticks again, and you start on categoryes[1] 您的外循环再次滴答,您从categoryes[1]开始categoryes[1]
  6. The inner loop ticks again, you get 4 records, and now you're storing them into the SAME again: $gameguides[0] , [1] , [2] , [3] , etc... 内部循环再次滴答$gameguides[0] ,您获得4条记录,现在您又将它们存储到SAME中$gameguides[0][1][2][3]等。
  7. You've now trashed the data you fetched in the first loop, and will 现在,您已经丢弃了在第一个循环中获取的数据,并且将

do so for every category you fetch. 对您获取的每个类别都执行此操作。

This code is very inefficient. 此代码效率很低。 You should learn how to use JOIN s, and fetch into a single structure, eg 您应该学习如何使用JOIN ,并获取单个结构,例如

SELECT category.id, category.name, ...., content.id, content.name
FROM categories
LEFT JOIN content ON categories.id = content.category_id
ORDER BY ...

and then something like 然后像

$data = array();
while($row = fetch row from db) {
    if (!isset($data[$row['category.id']]) {
       $data[$row['category.id']] = array(
           'name' => $row['category.name'],
           'content' => array()
       );
    }
    $data[$row['category.id']]['content'][] = array(
          ... save content data here
    );
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM