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

时间:2013-08-12 21:34:12

标签: php opencart

我遇到的问题是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)

任何关于我犯了什么错误的想法都会受到赞赏!

萨姆

2 个答案:

答案 0 :(得分:0)

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

您将$i设置为从0开始,只要您发现$row['category_id']位于$cat_level_1内某处,就会删除第一个条目,而不是与{匹配的实际条目{1}}。

您可能希望使用$row['category_id']功能,它会返回找到项目的密钥,如果您将array_search()设置为该密钥,那么您的代码可能会有更好的结果。

答案 1 :(得分:0)

所以你的代码所做的是:

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

现在if条件只匹配 ,如果SQL查询返回多个具有相同category_id的类别 - 我猜它不会......如果确实如此,那么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逻辑...