Php 在\u数组中未从定义的数组中找到当前项
我遇到一个问题,in_数组似乎无法在数组中找到值。该数组由多个表中的类别和信息构成,但这些都是格式良好的(相对而言!)。代码的目的是,如果行在$level中具有正确的值(函数中提供),并且在数组中尚未找到category_id,则应添加它。如果在数组中找到它,则应将其从数组中删除。我已经完成了调试,看起来in_数组永远不会返回正数,所以我认为我在这里的实现中犯了一个错误。见下面的代码:Php 在\u数组中未从定义的数组中找到当前项,php,opencart,Php,Opencart,我遇到一个问题,in_数组似乎无法在数组中找到值。该数组由多个表中的类别和信息构成,但这些都是格式良好的(相对而言!)。代码的目的是,如果行在$level中具有正确的值(函数中提供),并且在数组中尚未找到category_id,则应添加它。如果在数组中找到它,则应将其从数组中删除。我已经完成了调试,看起来in_数组永远不会返回正数,所以我认为我在这里的实现中犯了一个错误。见下面的代码: $sql = 'SELECT c.category_id, cd.name, cp.level ' .
$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行)为:
任何关于我犯了什么错误的想法都将不胜感激
Sam我相信你的问题是
unset($cat_level_1[$I])代码>
您正在将$i
设置为从0开始,并且当您发现$row['category\u id']
位于$cat\u level\u 1
内时,您会删除第一个条目,而不是与$row['category\u id']匹配的实际条目。
您可能想改用array\u search()
函数,它将返回您找到的项的键,如果您将$i
设置为该键,那么您的代码可能会有更好的结果。因此,您的代码所做的是:
- 创建空数组
$cat_level_1
,其中将存储第一级类别
- 选择所有类别(!!!)
- 绕过去
- 在每个循环中,检查类别是否为level
$level
,我猜在之前的某个地方设置为1
(可能发布整个逻辑代码会更好)
- 如果
$cat\u level\u 1
包含正在处理的类别,请完全删除该条目
- 否则将其添加到
$cat\u level\u 1
数组中
现在,如果SQL查询返回多个具有相同category\u id
的category,那么if
条件将被匹配,我想它不会。。。如果是这样,那么SQL查询是错误的
我不会问你为什么需要这样一个逻辑,但考虑一些修改:
- 为查询设置
$level
,以便只返回$level
级别的类别
- 检查所有返回的类别,并检查是否有重复条目(相同的
category\u id
多次-如果是,请尝试在SQL查询中使用GROUP BY
子句
- 加入oc_XXX_描述表时,始终使用实际的
语言\u id
然后,您的查询可能如下所示:
$sql='SELECT c.category\u id,cd.name,cp.level'。
“来自oc_c类”。
'左连接c_类别_说明cd'。
'在cd.category_id=c.category_id和cd.language_id='。$this->config->get('language_id')。
'左连接oc\u类别\u路径cp'。
“ON cp.category\u id=c.category\u id”。
'其中cp.level='。$level;
应生成以下内容,例如,此查询:
选择c.category\u id、cd.name、cp.level
来自oc_c类
左键连接c_category_description cd ON cd.category_id=c.category_id和cd.language_id=2
在cp.category\u id=c.category\u id上左连接oc\u category\u路径cp
其中cp.level=1
现在,您不需要任何PHPif-level
和if-in-u-array
logic…用于代码的这一部分:if(in-u-array($row['category\u-id',$cat\u-level\u-1)){$cat_level_1从何而来?您只会取消设置为$i。在任何情况下,它都只会取消设置数组的最后一个索引,因为您在每次循环后都会递增。在数组取消设置后,您将超过实际数组的索引。$i将始终大于元素数。我假设您正在构建$cat_级别为1,在进入循环之前,它是未定义的,因为它总是要先通过else来获取值-我可能应该在上面定义它,但它只是空的。为什么不在SQL中完成这一切,而不是在PHP中对连接中的每一行执行slurp并进行测试呢?我想虽然有一段时间是这样的,但我在if in_数组检查中返回了一个自动递增的check var,它总是返回0,如果问题是unset,我希望它返回一个正数……如果在else中设置了一个check变量,它返回的数字与数组中的值相同,我想说的是,您是unset正在删除$cat\u level\u 1
中的错误项目。您可以使用\u array
中的检查项目是否在类别数组中,如果在类别数组中,则删除列表中从索引0开始的项目,而不是要删除的实际项目。例如:您有一个数组[1,5,10],您测试5
是否在数组中,如果在数组中,您最终会删除1
留下一个数组[5,10],而实际上您想删除5
留下一个数组[1,10]。谢谢,但我认为这可能是一个单独的问题,我添加了一个新变量来检查它是否进入if语句,但它没有,它返回0-请参阅下面的代码if(在数组中($row['category\u id',$cat\u level\u 1)){unset($cat\u level\u 1[$i]);$c++}(在上面的$c是返回0的变量,而如果数组内检查按预期执行,则返回递增的数字)在这种情况下,我将检查以确保category\u id
是列的确切名称,并且您没有丢失任何大写字母(区分大小写)。即使您的SELECT语句像这样拉取列c.cAtEgOrY\u iD
,生成的行数组中的键也将始终与数据库中实际列名的大小写匹配。我还将检查列级别
,以备不时之需。
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)