0

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

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

此时,如果 i 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 并不认为它在数组中。

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

4

2 回答 2

2

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

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

于 2012-06-11T14:12:12.210 回答
1

in_array不起作用的原因是它检查第一个数组是否是第二个数组中的一个元素——当然,它不是。不经过完整的逻辑,做你的比较,你可以使用array_diff

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

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

于 2012-06-10T19:15:36.597 回答