首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何合并唯一的这两个数组?

如何合并唯一的这两个数组?
EN

Stack Overflow用户
提问于 2019-01-10 23:49:16
回答 2查看 50关注 0票数 0

我将两个json转换为数组,其中包含所有远程jenkin作业和所有本地jenkin作业,格式如下:

远程作业($remoteJobs):

代码语言:javascript
运行
复制
    {
      "_class" : "hudson.model.Hudson",
      "jobs" : [
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "hello",
          "url" : "http://10.0.0.1:8080/job/hello/"
        },
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "byebye",
          "url" : "http://10.0.0.1:8080/job/byebye/"
        },
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "HERE",
          "url" : "http://127.0.0.1:8080/job/HERE/"
        },
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "hey",
          "url" : "http://10.0.0.1:8080/job/hey/"
        }
      ]
    }

本地作业($localJobs):

代码语言:javascript
运行
复制
    {
      "_class" : "hudson.model.Hudson",
      "jobs" : [
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "hello",
          "url" : "http://127.0.0.1:8080/job/hello/"
        },
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "byebye",
          "url" : "http://127.0.0.1:8080/job/byebye/"
        },
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "hey",
          "url" : "http://127.0.0.1:8080/job/hey/"
        }
      ]
    }

我只需要保留本地作业数组中不存在的值,并按作业名称进行比较

尝试:

代码语言:javascript
运行
复制
arrayRecursiveDiff();
array_unique();
array_merge_recursive();

预期输出:

代码语言:javascript
运行
复制
    {
      "_class" : "hudson.model.Hudson",
      "jobs" : [
        {
          "_class" : "hudson.model.FreeStyleProject",
          "name" : "HERE",
          "url" : "http://127.0.0.1:8080/job/HERE/"
        }
      ]
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-11 00:24:55

下面的方法应该是可行的。我假设解码后的json分别位于变量$remote$local中。

代码语言:javascript
运行
复制
$result = $remote; // copy $remote array as a base for the result array
$result['jobs'] = array_udiff(
    $remote["jobs"],
    $local["jobs"],
    function ($a, $b) {
        return $a['name'] <=> $b['name'];
    }
);
$result['jobs'] = array_values($result['jobs']);

它只需要使用自定义比较函数(因此是array_udiff,而不仅仅是array_diff)比较“作业”部分的差异来比较“名称”键。

我添加了一个对array_values的调用来重置作业列表键编号(如果您将其转换回json也无关紧要)。

然后,$result变量应该包含您期望的内容。

票数 1
EN

Stack Overflow用户

发布于 2019-01-11 01:02:28

第一个问题是,你有一个对象,包含一个带有对象的数组。所以你必须遍历一个包含对象的数组。使用php函数来比较数组并不容易,因为您只查找远程作业,而不是所有作业都只查找远程作业或仅查找本地作业。1.将数组存储在变量中2.存储所有本地作业3.将它们与远程作业进行比较,并存储那些不是本地作业的作业。

代码语言:javascript
运行
复制
$jsonRemote = '{
  "_class" : "hudson.model.Hudson",
  "jobs" : [
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "hello",
      "url" : "http://10.0.0.1:8080/job/hello/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "byebye",
      "url" : "http://10.0.0.1:8080/job/byebye/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "HERE",
      "url" : "http://127.0.0.1:8080/job/HERE/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "hey",
      "url" : "http://10.0.0.1:8080/job/hey/"
    }
  ]
}' ;

        $jsonLocal = '{
  "_class" : "hudson.model.Hudson",
  "jobs" : [
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "hello",
      "url" : "http://127.0.0.1:8080/job/hello/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "byebye",
      "url" : "http://127.0.0.1:8080/job/byebye/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "hey",
      "url" : "http://127.0.0.1:8080/job/hey/"
    }
  ]
}' ;
        $ojctRemote = json_decode($jsonRemote) ;
        $objectLocal = json_decode($jsonLocal) ;
        var_dump($ojctRemote) ;
        $arrRemot = $ojctRemote->jobs ;
        $arrLocal = $objectLocal->jobs ;
        echo '<br/><br/>' ;
        $localJobnames =  [] ;
        $onlyRemot = []  ;
        foreach ($arrLocal as $localJob) {
            $localJobnames[] = $localJob->name ;
        }
        foreach ($arrRemot as $remoteJob) {
            if(!in_array($remoteJob->name, $localJobnames)){
                $onlyRemot[] = $remoteJob ;
            }
        }
        echo '<br/><br/>' ;
        var_dump($onlyRemot) ;
        echo '<br/><br/>' ;
        var_dump(2 <=> 2) ;
        echo '<br/><br/>' ;
        var_dump(2 <=> 3) ;
        echo '<br/><br/>' ;
        var_dump(4 <=> 3) ;

希望这能有所帮助。您可以将此代码直接粘贴到php文件中并运行它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54132292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档