in_array未从定义的数组中找到当前项


in_array not finding present items from defined array

我遇到一个问题,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)

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

Sam

我认为您的问题是unset($cat_level_1[$i]);

您将$i设置为从0开始,每当您发现$row['category_id']位于$cat_level_1内的某个位置时,您都会擦除第一个条目,而不是与$row['category_id']匹配的实际条目。

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

所以您的代码所做的是:

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

现在,如果SQL查询返回多个具有相同category_id的类别,那么if条件将仅匹配——我想它不会。。。如果是这样,那么SQL查询就是错误的。

我不会问你需要这样一个逻辑来做什么,但要考虑一些修改:

  • 为查询设置$level,以便只返回$level级别的类别
  • 检查所有返回的类别,并检查是否存在重复条目(同一个category_id重复一次-如果是,请尝试在SQL查询中使用GROUP BY子句
  • 加入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

现在您不需要任何PHP if levelif in_array逻辑。。。