我将两个json转换为数组,其中包含所有远程jenkin作业和所有本地jenkin作业,格式如下:
远程作业($remoteJobs):
{
"_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):
{
"_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/"
}
]
}我只需要保留本地作业数组中不存在的值,并按作业名称进行比较
尝试:
arrayRecursiveDiff();
array_unique();
array_merge_recursive();预期输出:
{
"_class" : "hudson.model.Hudson",
"jobs" : [
{
"_class" : "hudson.model.FreeStyleProject",
"name" : "HERE",
"url" : "http://127.0.0.1:8080/job/HERE/"
}
]
}发布于 2019-01-11 00:24:55
下面的方法应该是可行的。我假设解码后的json分别位于变量$remote和$local中。
$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变量应该包含您期望的内容。
发布于 2019-01-11 01:02:28
第一个问题是,你有一个对象,包含一个带有对象的数组。所以你必须遍历一个包含对象的数组。使用php函数来比较数组并不容易,因为您只查找远程作业,而不是所有作业都只查找远程作业或仅查找本地作业。1.将数组存储在变量中2.存储所有本地作业3.将它们与远程作业进行比较,并存储那些不是本地作业的作业。
$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文件中并运行它。
https://stackoverflow.com/questions/54132292
复制相似问题