获取包含父/子类别的总行数。困惑为啥 in_array 不起作用

Posted

技术标签:

【中文标题】获取包含父/子类别的总行数。困惑为啥 in_array 不起作用【英文标题】:Getting total amount of rows that contain parent/child categories. Confused why in_array isn't working获取包含父/子类别的总行数。困惑为什么 in_array 不起作用 【发布时间】:2012-06-08 17:54:51 【问题描述】:

我正在使用两个表:类别和企业。类别表如下所示:

id   name               parent
1    Automotive         NULL
2    Tires              1
3    Oil Change         1
4    Home Renovations   NULL
5    Painting           4
6    Landscaping        4
7    Bathroom           4

基本上,任何以NULL 为父类的类别都是父类。任何它的子项都会在父列中引用它的 ID。很简单。

我将业务存储在一个表中,每个业务都有类别。类别存储为json_encode,因此它们看起来像这样:

["1","4","5","13"]

用户可以添加子类而不添加父类,所以有些商家只有子类。

如果我想获取包含子类别的父类别的业务总数,这就是我正在做的事情:

$parent_categories = $this->db->order_by('name', 'asc')->get_where('categories', array('parent' => NULL));
$businesses = $this->db->select('category')->get('businesses');

foreach ($parent_categories->result() as $parent):
    $child_categories = $this->db->order_by('name', 'asc')->get_where('categories', array('parent' => $parent->id));

    $parentChildCategories = array();
    array_push($parentChildCategories, $parent->id);

    foreach($child_categories->result() as $child):
        array_push($parentChildCategories, $child->id);
    endforeach;
    // CONTINUED BELOW

此时,如果我print_r($parentChildCategories),我得到以下(不包括一堆其他类别数组,只关注一个):

Array ( [0] => 81 [1] => 80 )

所以这是父类别 ID 以及子类别 ID。这个父类别只有一个孩子,但其他人可能有多个。这似乎有效。

现在我想遍历每个业务类别字段,将json解码成一个php数组($categories_array),然后看看上面的数组($parentChildCategories)是否在其中。如果是,我会回应“是的”。

foreach($businesses->result() as $business):
    $categories_array = json_decode($business->category);

    if (in_array($parentChildCategories, $categories_array)):
        echo 'yep';
    endif;
endforeach;

问题是,我从来没有得到“是的”。没有。所以我 `print_r($categories_array)' 它给了我以下信息:

Array ( [0] => 80 [1] => 81 )

数组值与$parentChildCategories相同,但位置不同。所以 in_array 并不认为它在数组中。

我正用头撞墙试图弄清楚这一点。有没有更好的方法来做到这一点?我显然做错了什么。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您为什么以这种方式存储与业务相关的类别?如果您要规范化您的数据库,那么您一开始就不会遇到这个问题。

我建议创建一个新表“business_category_coupling”,其中包含 2 列:business_id 和 category_id。这基本上就是您所需要的,并且大大简化了维护。

【讨论】:

所以如果我走这条路,如果一个企业有多个类别,它本质上会在 category_coupling 表中有多个行?我本来打算这样做,但认为将类别保留为 json 会“更干净”。这是多么大的错误。 每个业务多行是很常见的,也是最好的方法。想象一下客户和订单之间的关系,你现在不会把它当作 json_encoded 字符串。 ;) 感谢您的建议。你让我的生活更轻松了。【参考方案2】:

in_array 不起作用的原因是它检查第一个数组是否是第二个数组中的元素 - 当然不是。无需通过完整的逻辑进行比较,您可以使用array_diff

$ad = array_diff($parentChildCategories, $categories_array);
if(count($ad)) 
    echo 'yep';

此代码查找$parentChildCategories 中不存在于$categories_array 中的所有元素。如果没有,则输出yep

【讨论】:

以上是关于获取包含父/子类别的总行数。困惑为啥 in_array 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

查询以获取每个类别 + 子类别的相同行数

在java 中子类对象为啥不能比父类对象有更严格的访问权限?

如何获取DataGrid的总行数

子类为啥要调用父类的构造函数

获取所有属于子类别的文章 多对多 Laravel

在oracle数据库中有时候like加上not like 的数据却不等于总行数为啥