[英]How to merge unique this two arrays?
我正在將兩個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/"
}
]
}
以下應該工作。 我假設解碼的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
)僅占用了“ jobs”部分的差異。
我添加了對array_values
的調用以重置作業列表鍵編號(無論如何,無論如何將其轉換回json都沒關系)。
之后, $result
變量應包含您期望的內容。
第一個問題是,您有一個對象,其中包含帶有對象的數組。 因此,您必須遍歷包含對象的數組。 使用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文件中並運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.