我遇到一个问题,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 level
和if in_array
逻辑。。。