V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bitkwan
V2EX  ›  PHP

多维数组的比较问题...

  •  
  •   bitkwan · 2016-08-11 01:49:40 +08:00 · 2065 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $_array1=[
        0=>["aaa","bbbb"],
        1=>["bbb","cccc"],
        2=>["ccc","dddd"]
    ]
    $_array2=[
        0=>["aaa","bbbb"],
        1=>["ccc","dddd"],
        2=>["bbb","cccc"]
    ]
    

    发现 array_diff_assoc 比较不支持多维数组.... 然后这样写:

    function array_diff_assoc_recursive($array1,$array2){
        $diffarray=array();
        foreach ($array1 as $key=>$value){
          //判断数组每个元素是否是数组
         if(is_array($value)){
    		#print_r($value); echo"<br/>";
          //判断第二个数组是否存在 key
           if(!isset($array2[$key])){
               $diffarray[$key]=$value;
           //判断第二个数组 key 是否是一个数组
           }elseif(!is_array($array2[$key])){
               $diffarray[$key]=$value;
           }else{
               $diff=array_diff_assoc_recursive($value, $array2[$key]);
               if($diff!=false){
                 $diffarray[$key]=$diff;
               }
           }
         }elseif(!array_key_exists($key, $array2) || $value!=$array2[$key]){
              $diffarray[$key]=$value;
         }
        }
        return $diffarray;  
    }
    

    结果是: [1=>["bbb","cccc"],2=>["ccc","dddd"]] 会因为 key 顺序的不一样,也会被列出为 diff 数组。

    = =想问下如何只判断 value 不去判断 key 顺序,而直接的去判断他们 value 里的数组。

    4 条回复    2016-08-11 17:12:15 +08:00
    caola
        1
    caola  
       2016-08-11 02:37:07 +08:00   ❤️ 1
    foreach ($_array1 as $value) {
    if (!in_array($value, $_array2)) {
    //如果不存在,证明两数组不相同
    }
    }
    bitkwan
        2
    bitkwan  
    OP
       2016-08-11 06:20:25 +08:00
    @caola 感谢=3
    ianva
        3
    ianva  
       2016-08-11 10:45:12 +08:00
    var arrayToString = arr => arr.map( item=>typeof item === 'string' ? item :arrayToString( item ) ).join('').replace(/(.*)/,'[$1]');

    var diff = (src, target)=> arrayToString(src) === arrayToString(target)

    or

    diff = (src, target) => JSON.stringify(src) === JSON.stringify(target)
    Sunyanzi
        4
    Sunyanzi  
       2016-08-11 17:12:15 +08:00
    一楼的做法不完善 ... 没有考虑重复的情况 ... 如果是我我会用 array_pop 和 array_search 处理 ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1301 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:43 · PVG 01:43 · LAX 10:43 · JFK 13:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.