话不多说。。 直接上代码
<?php /* *php比较一个数组中的所有值,在另外一个数组中是否都有。 *比如有以下应用场景:用户在购买商品的时候下了一条订单,需要判断改订单是否可以使用当前用户所有拥有的优惠券 使用优惠券的规则:假如当前订单下用户购买了两件商品,那么每一件商品的cat_id(以下数组中$goods_data下的cat_id)都必须在用户所拥有的 所有优惠券(以下数组中$coupon_list下的category_limit下的cat_id)中出现,那么当前优惠券$coupon_list才可以保留,也就是说当前优惠券才可以使用 比如说:下面一条订单下的两个商品($goods_data)的cat_id一个为16,另一个也是为16,那么只有所有商品的cat_id在某一个当前优惠券下的($coupon_list) category_limit下的 cat_id中出现,当前优惠券才能使用。或者说当前订单下的两件商品的cat_id都是16,只要优惠券下的catgory_limit下的cat_id有16,那么当前优惠券也是可以使用的。 这里主要就是比较$goods_data下的cat_id是否和所有优惠券中的category_limit下的cat_id一样,一样的话就保留当前优惠券数组 详情看一下代码: * */ //假如 当前订单下有两件商品,两件商品信息如下: $goods_data = array( array( 'goods_id' => '61', 'cat_id' => '16', 'brand_id' => '1', ), array( 'goods_id' => '113', 'cat_id' => '16', 'brand_id' => '2', ) ); //当前优惠所拥有的所有优惠券,一共有三个数组,也就是说一共有三张优惠券 $coupon_list = array( array ( 'coupon_id' => '30', 'is_use' => '1', 'is_return_account' => '1', 'type_name' => 'zyl优惠券', 'type_money' =>'10', 'category_limit' => array(array('cat_id'=>'16'), array('cat_id'=>'18')), 'available_city' => array(array('region_id'=>'52'),), 'appoint_brand' => array(array('brand_id'=>'1'), array('brand_id'=>'2'), array('brand_id'=>'3'),), ), array ( 'coupon_id' => '1', 'is_use' => '1', 'is_return_account' => '1', 'type_name' => '年终优惠券', 'type_money' =>'100', 'category_limit' => array(array('cat_id'=>'19')), 'available_city' => array(), 'appoint_brand' => array(), ), array ( 'coupon_id' => '31', 'is_use' => '1', 'is_return_account' => '0', 'type_name' => '10', 'type_money' =>'100', 'category_limit' => array(array('cat_id'=>'16'), array('cat_id'=>'18')), 'available_city' => array(array('region_id'=>'297'), ), 'appoint_brand' => array(array('brand_id'=>'0')), ), ); /*获取当前商品下的所有cat_id,获取到的值组装到一个新的数组中 即:$cat_ids @parameter array $goods 需要传入一个一维数组 一维数组里面有cat_id这个键(key) @return array $cat_ids 返回一个一维数组 * */ function goods_cat_ids($goods) { $cat_ids = array(); foreach ($goods as $good) { //$cat_ids的键($key)就是当前循环遍历中的$good['cat_id']的值,而当前$cat_ids的键(key)对应的值 依然是当前循环遍历中的$good['cat_id']的值 $cat_ids[$good['cat_id']] = $good['cat_id']; //如果不使用以上这种方式,使用以下这种方式也是可以的。 //$cat_ids[] = $good['cat_id']; } return $cat_ids; } /*获取当前循环遍历中当前优惠券的category_limit下的所有的cat_id的值,获取到的值重新组装到一个新的数组中 为什么叫循环遍历 是因为此方法需要在最后一个方法中被foreach循环调用 @return array $cat_ids 返回一个一维数组 * */ function get_cat_limit($category_limit) { $cat_ids = array(); foreach ($category_limit as $cat_id) { $cat_ids[] = $cat_id['cat_id']; } return $cat_ids; } /*比较两个数组中的cat_id的值($goods_data和当前优惠券下的category_limit下的cat_id的值) * */ function matched_coupon($goods, $coupon) { $goods_cat_ids = goods_cat_ids($goods); //获取所有商品的cat_id $cat_limit = get_cat_limit($coupon['category_limit']); //获取当前优惠券下的category_limit下的cat_id的值 /*array_diff是求两个数组中的差集 array_diff($arr1,$arr2)表示 返回$arr1中在$arr2中不存在的值,这里也就是说返回$goods_cat_ids中,在$cat_limit没有出现过的值, 如果$goods_cat_ids中的值在$cat_limit中没有出现(也就是说前者($goods_cat_ids)的值,在后者($cat_limit)中并没有全部都出现),此时 就产生了$goods_cat_ids和$cat_limit中的差集,那么就会返回$goods_cat_ids中在$cat_limit中不存在的值,那么array_diff就会返回一个差集数组 * */ /*return array_diff($goods_cat_ids, $cat_limit) == array();这就话表示 如果array_diff的返回值为空数组(也就是说,前者($goods_cat_ids)中的值, 在后者($cat_limit)中全都出现了)那么就返回一个空数组 返回的这个空数组和后面的 == array()进行比较 然后将比较后的结果返回, 如果array_diff()函数返回的是一个空数组,那么空数组和 == array()进行比较 空数组 == array()是成立的,那么也就是说这个比较的返回值为true,否则的话, 返回的就不是一个空数组而是一个有结果的数组 有结果的数组 == array()这个比较肯定是不成立的(因为一个有值的数组和一个空数组比较,肯定不成立所以为false),所以返回false * */ return array_diff($goods_cat_ids, $cat_limit) == array(); } /*开始循环比较当前$coupon_list数组的cat_id和$goods_data进行对比 * */ function filter_coupon($goods_data, $coupon_list) { $coupons = array(); foreach ($coupon_list as $k_c => $coupon) { /*开始循环遍历$coupon_list让当前的category_limit下的cat_id和所有商品进行比较 * 如果matched_coupon($goods_data, $coupon),也就说如果为真 表示matched_coupon返回的是真(也就说matched_coupon内部array_diff()没有差集出现) * 那么说明当前$coupon_list下的category_limit下的cat_id都包含了$goods_data中的cat_id,符合使用优惠券规则,将当前优惠券保留到数组中 * */ if(matched_coupon($goods_data, $coupon)) { //符合使用优惠券规则,将当前优惠券保留到数组中 $coupons[$k_c] = $coupon; } } //最后将保留进来的优惠券返回 return $coupons; } var_dump(filter_coupon($goods_data, $coupon_list)); /*最后筛选出来的优惠券中只有coupon_id = 30和coupon_id = 31的被保留下来了,也就是三张优惠券中有两张符合规则的优惠券 * */ ?>
因为要做一个优惠券功能。。这个代码也是由我师傅(czp)给我写的一个demo,然后我自己给翻译过来了。。非常感谢我师傅!我自己也要加油!
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论