Php 在\u数组中未从定义的数组中找到当前项

Php 在\u数组中未从定义的数组中找到当前项,php,opencart,Php,Opencart,我遇到一个问题,in_数组似乎无法在数组中找到值。该数组由多个表中的类别和信息构成,但这些都是格式良好的(相对而言!)。代码的目的是,如果行在$level中具有正确的值(函数中提供),并且在数组中尚未找到category_id,则应添加它。如果在数组中找到它,则应将其从数组中删除。我已经完成了调试,看起来in_数组永远不会返回正数,所以我认为我在这里的实现中犯了一个错误。见下面的代码: $sql = 'SELECT c.category_id, cd.name, cp.level ' .

我遇到一个问题,in_数组似乎无法在数组中找到值。该数组由多个表中的类别和信息构成,但这些都是格式良好的(相对而言!)。代码的目的是,如果行在$level中具有正确的值(函数中提供),并且在数组中尚未找到category_id,则应添加它。如果在数组中找到它,则应将其从数组中删除。我已经完成了调试,看起来in_数组永远不会返回正数,所以我认为我在这里的实现中犯了一个错误。见下面的代码:

$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

现在,您不需要任何PHP
if-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)