获取包含父/子类别的总行数。困惑为啥 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章