簡體   English   中英

如何合並這兩個數組的唯一性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM