0

我遇到了一个问题,in_array 似乎没有在数组中找到值。该数组由来自多个表的类别和信息构成,但这一切都很好(相对!)。代码的目的是,如果行在 $level 中具有正确的值(在函数中提供),并且在数组中还没有找到 category_id,那么应该添加它。如果在数组中找到它,则应将其完全从数组中删除。我已经通过调试,似乎 in_array 永远不会返回正面,所以我认为我在这里的实现中犯了一个错误。请参见下面的代码:

$sql = 'SELECT c.category_id, cd.name, cp.level ' .
       'FROM oc_category c ' . 
       'LEFT JOIN c_category_description cd ' .
       'ON cd.category_id = c.category_id ' .
       'LEFT JOIN oc_category_path cp ' .
       'ON cp.category_id = c.category_id';

$categories = $mysqli->query($sql);

$i = 0;
while($row = $categories->fetch_array())
{
    if ($row['level'] == $level)
    {
        if (in_array($row['category_id'], $cat_level_1))
        {
            unset($cat_level_1[$i]);    
            $i++;
        }
        else
        {
            $cat_level_1[] = $row['category_id'];
            $i++;
        }
    }   
} 

目前,此(截断为 7 行)的输出为:

array (size=40)
  0 => string '17' (length=2)
  1 => string '18' (length=2)
  2 => string '20' (length=2)
  3 => string '24' (length=2)
  4 => string '25' (length=2)
  5 => string '26' (length=2)

任何关于我犯了什么错误的想法都将不胜感激!

山姆

4

2 回答 2

0

我相信你的问题是unset($cat_level_1[$i]);

您设置$i为从 0 开始,并且任何时候您发现它$row['category_id']位于内部某处时,$cat_level_1您都会删除第一个条目,而不是与$row['category_id'].

您可能想改用array_search()函数,它将返回找到的项目的密钥,如果您设置$i为该密钥,那么您的代码可能会有更好的结果。

于 2013-08-12T21:44:32.620 回答
0

所以你的代码所做的是:

  • $cat_level_1创建将存储第一级类别的空数组
  • 选择所有类别(!!!)
  • 循环它们
  • 在每个循环中检查类别是否属于$level我猜之前设置为1某处的级别(也许发布整个逻辑代码会更好)
    • 如果$cat_level_1包含正在处理的类别,则完全删除该条目
    • 否则将其添加到$cat_level_1数组

现在,只有当 SQL 查询返回一个以上相同的类别时,if条件才会匹配- 我猜它不会......如果它确实如此,那么 SQL 查询是错误的。category_id

我不会问你需要做什么你需要做这样的逻辑,但想想一些修改:

  • $level为查询设置,因此只$level返回级别的类别
  • 检查所有返回的类别并检查是否有重复的条目(相同的category_id不止一次 - 如果是这样,请尝试GROUP BY在 SQL 查询中使用子句
  • 加入 oc_XXX_description 表时,始终使用实际language_id

然后您的查询可能如下所示:

$sql = 'SELECT c.category_id, cd.name, cp.level ' .
   'FROM oc_category c ' . 
   'LEFT JOIN c_category_description cd ' .
   'ON cd.category_id = c.category_id AND cd.language_id = ' . $this->config->get('language_id') . 
   'LEFT JOIN oc_category_path cp ' .
   'ON cp.category_id = c.category_id' . 
   'WHERE cp.level = ' . $level;

这应该产生例如这个查询:

SELECT c.category_id, cd.name, cp.level
FROM oc_category c
    LEFT JOIN c_category_description cd ON cd.category_id = c.category_id AND cd.language_id = 2
    LEFT JOIN oc_category_path cp ON cp.category_id = c.category_id
WHERE cp.level = 1

现在你不应该需要任何 PHPif levelif in_array逻辑......

于 2013-08-15T11:34:59.877 回答