php比较一个数组中的所有值,在另外一个数组中是否都有。

话不多说。。 直接上代码

<?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,然后我自己给翻译过来了。。非常感谢我师傅!我自己也要加油!


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与