• 技术文章 >后端开发 >php教程

    如何判断两组字符串是否有相同的字符?

    2016-06-23 13:56:21原创1095
    $a=2344;//主字符串,固定值。

    //下面为可变化的变量
    如果$b=12;//判断$a字符串中是否包含1和2,判断后结果为假
    如果$b=22;//判断$a字符串中是否包含两个2,判断后结果只有一个2,假
    如果$b=234;//判断$a字符串中是否包含2,3,4.判断后结果$a中全部包含,真
    如果$b=324;//判断$a字符串中是否包含3,2,4.判断后结果$a中全部包含,真
    如果$b=4432;//判断$a字符串中是否包含4,4,3,2.判断后结果$a中全部包含,真
    如果$b=4444;//判断$a字符串中是否包含4个4,.判断后结果$a只有二个4,假
    如果$b
    如果$b
    如果$b
    ......后面还会有许多

    我需要的判断结果为如上。
    判断语句怎么写?


    回复讨论(解决方案)

    $a = '2344';$d = array('12', '22', '234', '324', '4432', '4444');$a = count_chars($a, 1);foreach($d as $b) {  $t = count_chars($b, 1);  $f = 0;  if(array_keys(array_intersect_key($t, $a)) == array_keys($a)) $f = 1;  printf("b = %s %s\n", $b, $f ? '真' : '假');}
    b = 12 假b = 22 假b = 234 真b = 324 真b = 4432 真b = 4444 假

    如果$b=4444;//判断$a字符串中是否包含4个4,.判断后结果$a只有二个4,假
    这条规则似乎不妥

    把$a和$b按字符分别拆成数组,然后判断是否子集?

    不知道你这样做的目的是什么?
    要从业务逻辑入手,可能有更好的解决方案。

    $a = '2344';$d = array('12', '22', '234', '324', '4432', '4444');$a = count_chars($a, 1);foreach($d as $b) {  $t = count_chars($b, 1);  $f = 0;  if(array_keys(array_intersect_key($t, $a)) == array_keys($a)) $f = 1;  printf("b = %s %s\n", $b, $f ? '真' : '假');}
    b = 12 假b = 22 假b = 234 真b = 324 真b = 4432 真b = 4444 假

    如果$b=4444;//判断$a字符串中是否包含4个4,.判断后结果$a只有二个4,假
    这条规则似乎不妥



    这样的判断还是有缺陷啊,
    如果$a为4444呢。
    我想要的结果是,只有$b=4444;或者$b=44,或者$b=444或者$b=4的时候,才能匹配成功,才能为真,其他都不符合,

    我已经说了,你的规则有问题(或者说不完备)
    我给的代码只能处理一种情况:$a 中的所有字符(去除重复的)都必须出现在 $b 中

    等你制定好完备的规则后,再去扩展功能

    先把字符串转换成数组,然后用array_count_values计算各字符出现的字数,如果$b中出现的次数小于等于$a中出现的字数就是真,否则就是假。

    我已经说了,你的规则有问题(或者说不完备)
    我给的代码只能处理一种情况:$a 中的所有字符(去除重复的)都必须出现在 $b 中

    等你制定好完备的规则后,再去扩展功能



    直接说我的业务需求吧,或许能明白一点,
    这样子的。
    七星彩你应该知道吧,
    我们公司需要做一个这样的一个游戏活动。

    如果这期开奖号码是5667 321
    这里我们只截取前面四位数,也就是5667来作为是否中奖,后面三位省略掉。
    而中奖规则为四等奖项。
    一等奖为四个数同现,意思是,四个数字同时出现
    二等奖为三个数同现,
    三等奖为二个数同现,
    四等奖为一个数同现。
    那么, 开奖之前,会有许多人来投注。

    如果a单投了一个5,则开奖号码中有一个5,则中奖了。但他中的是四等奖。
    如果B投了567,则开奖号码中同时出现567,中了个2等奖。
    如果C投了66,则开奖号码中,有两个6同时出现,也中了。(可能会问,为什么这样投呢,因为如果投重复码并中奖的话,奖励会翻倍。)
    如果D投了5676,则开奖号码中全部匹配,中了一等奖。

    大概是这样的一个规则。意思是,不过你投了1个数字或者4个数字,开奖号码中,必须全部匹配才能中奖。包括重复数

    $a='5415';$a=str_split($a);$a=array_count_values($a);$b='514';$b=str_split($b);$b=array_count_values($b);$result=true;foreach($b as $k=>$v){    if(!isset($a[$k]) OR $a[$k]<$v){        $result=false;        break;    }}var_dump($result);

    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:两组 字符串 判断 字符
    上一篇:对数组进行分组 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 你知道如何用PHP实现多进程吗• CI框架源码阅览-Model.php • php将csv文件导入到mysql数据库的方法,_PHP教程• php中单双引号的区别_PHP教程• php多功能图片处理类分享(php图片缩放类)_PHP教程
    1/1

    PHP中文网