合并多 demation 数组,以便保留值,但合并两端的重复项


Merging multidemational Array so that the values get preserved but duplicates on both sides merged

嗨,我有一个数组,假设有 3 个数组,

里面还有另外几个数组,如下所示:

array(3) {
  [0]=>
  array(2) {
    ["disease_id"]=>
    array(13) {
      [0]=>
      string(1) "5"
      [1]=>
      string(2) "14"
      [2]=>
      string(2) "12"
      [3]=>
      string(2) "17"
      [4]=>
      string(2) "16"
      [5]=>
      string(2) "15"
      [6]=>
      string(1) "4"
      [7]=>
      string(1) "3"
      [8]=>
      string(2) "18"
      [9]=>
      string(1) "9"
      [10]=>
      string(1) "2"
      [11]=>
      string(2) "20"
      [12]=>
      string(1) "1"
    }
    ["params"]=>
    object(stdClass)#160 (39) {
      ["disease_cpe_5"]=>
      string(1) "1"
      ["disease_mbr_5"]=>
      string(4) "1234"
      ["disease_mtr_5"]=>
      string(2) "12"
      ["disease_cpe_14"]=>
      string(1) "1"
      ["disease_mbr_14"]=>
      string(1) "2"
      ["disease_mtr_14"]=>
      string(1) "2"
      ["disease_cpe_12"]=>
      string(2) "12"
      ["disease_mbr_12"]=>
      string(2) "12"
      ["disease_mtr_12"]=>
      string(2) "12"
      ["disease_cpe_17"]=>
      string(1) "4"
      ["disease_mbr_17"]=>
      string(1) "1"
      ["disease_mtr_17"]=>
      string(1) "1"
      ["disease_cpe_16"]=>
      string(1) "4"
      ["disease_mbr_16"]=>
      string(2) "21"
      ["disease_mtr_16"]=>
      string(3) "122"
      ["disease_cpe_15"]=>
      string(3) "132"
      ["disease_mbr_15"]=>
      string(3) "132"
      ["disease_mtr_15"]=>
      string(1) "1"
      ["disease_cpe_4"]=>
      string(1) "1"
      ["disease_mbr_4"]=>
      string(1) "1"
      ["disease_mtr_4"]=>
      string(1) "9"
      ["disease_cpe_3"]=>
      string(1) "7"
      ["disease_mbr_3"]=>
      string(1) "8"
      ["disease_mtr_3"]=>
      string(1) "9"
      ["disease_cpe_18"]=>
      string(1) "1"
      ["disease_mbr_18"]=>
      string(1) "1"
      ["disease_mtr_18"]=>
      string(1) "1"
      ["disease_cpe_9"]=>
      string(1) "3"
      ["disease_mbr_9"]=>
      string(1) "3"
      ["disease_mtr_9"]=>
      string(1) "3"
      ["disease_cpe_2"]=>
      string(1) "3"
      ["disease_mbr_2"]=>
      string(1) "3"
      ["disease_mtr_2"]=>
      string(1) "3"
      ["disease_cpe_20"]=>
      string(2) "10"
      ["disease_mbr_20"]=>
      string(2) "11"
      ["disease_mtr_20"]=>
      string(2) "12"
      ["disease_cpe_1"]=>
      string(1) "1"
      ["disease_mbr_1"]=>
      string(1) "3"
      ["disease_mtr_1"]=>
      string(1) "3"
    }
  }
  [1]=>
  array(3) {
    ["disease_id"]=>
    array(8) {
      [0]=>
      string(1) "5"
      [1]=>
      string(2) "14"
      [2]=>
      string(2) "12"
      [3]=>
      string(2) "17"
      [4]=>
      string(2) "16"
      [5]=>
      string(1) "8"
      [6]=>
      string(2) "15"
      [7]=>
      string(1) "4"
    }
    ["risk_id"]=>
    array(1) {
      [0]=>
      string(1) "4"
    }
    ["params"]=>
    object(stdClass)#235 (27) {
      ["disease_cpe_5"]=>
      string(1) "2"
      ["disease_mbr_5"]=>
      string(1) "1"
      ["disease_mtr_5"]=>
      string(1) "1"
      ["disease_cpe_14"]=>
      string(1) "2"
      ["disease_mbr_14"]=>
      string(1) "2"
      ["disease_mtr_14"]=>
      string(1) "2"
      ["disease_cpe_12"]=>
      string(2) "12"
      ["disease_mbr_12"]=>
      string(2) "12"
      ["disease_mtr_12"]=>
      string(2) "12"
      ["disease_cpe_17"]=>
      string(1) "1"
      ["disease_mbr_17"]=>
      string(1) "1"
      ["disease_mtr_17"]=>
      string(1) "1"
      ["disease_cpe_16"]=>
      string(1) "1"
      ["disease_mbr_16"]=>
      string(1) "5"
      ["disease_mtr_16"]=>
      string(1) "6"
      ["disease_cpe_8"]=>
      string(2) "11"
      ["disease_mbr_8"]=>
      string(1) "1"
      ["disease_mtr_8"]=>
      string(1) "1"
      ["disease_cpe_15"]=>
      string(3) "132"
      ["disease_mbr_15"]=>
      string(3) "132"
      ["disease_mtr_15"]=>
      string(1) "1"
      ["disease_cpe_4"]=>
      string(1) "7"
      ["disease_mbr_4"]=>
      string(1) "8"
      ["disease_mtr_4"]=>
      string(1) "9"
      ["risk_cpe_4"]=>
      string(1) "1"
      ["risk_mbr_4"]=>
      string(1) "2"
      ["risk_mtr_4"]=>
      string(1) "3"
    }
  }
  [2]=>
  array(3) {
    ["disease_id"]=>
    array(6) {
      [0]=>
      string(1) "5"
      [1]=>
      string(2) "14"
      [2]=>
      string(2) "12"
      [3]=>
      string(1) "8"
      [4]=>
      string(2) "15"
      [5]=>
      string(1) "4"
    }
    ["risk_id"]=>
    array(2) {
      [0]=>
      string(1) "4"
      [1]=>
      string(1) "3"
    }
    ["params"]=>
    object(stdClass)#184 (24) {
      ["disease_cpe_5"]=>
      string(1) "2"
      ["disease_mbr_5"]=>
      string(1) "1"
      ["disease_mtr_5"]=>
      string(1) "1"
      ["disease_cpe_14"]=>
      string(1) "2"
      ["disease_mbr_14"]=>
      string(1) "2"
      ["disease_mtr_14"]=>
      string(1) "2"
      ["disease_cpe_12"]=>
      string(2) "12"
      ["disease_mbr_12"]=>
      string(2) "12"
      ["disease_mtr_12"]=>
      string(2) "12"
      ["disease_cpe_8"]=>
      string(2) "11"
      ["disease_mbr_8"]=>
      string(1) "1"
      ["disease_mtr_8"]=>
      string(1) "1"
      ["disease_cpe_15"]=>
      string(3) "132"
      ["disease_mbr_15"]=>
      string(3) "132"
      ["disease_mtr_15"]=>
      string(1) "1"
      ["disease_cpe_4"]=>
      string(1) "7"
      ["disease_mbr_4"]=>
      string(1) "8"
      ["disease_mtr_4"]=>
      string(1) "9"
      ["risk_cpe_4"]=>
      string(1) "1"
      ["risk_mbr_4"]=>
      string(1) "2"
      ["risk_mtr_4"]=>
      string(1) "3"
      ["risk_cpe_3"]=>
      string(1) "5"
      ["risk_mbr_3"]=>
      string(1) "5"
      ["risk_mtr_3"]=>
      string(1) "5"
    }
  }
}

现在我需要将这些数组合并为一个,并且在 ["disease_id"] 和 ["risk_id"] 子数组中的值匹配的地方,我应该删除重复项,但是当键在 ["params"] 对象中匹配时,我需要保留两个值,但在对象中转储重复的键,因此结果如下:

array(1) {
      [0]=>
      array(2) {
        ["disease_id"]=>
        array(13) {
          [0]=>
          string(1) "5"
          [1]=>
          string(2) "14"
          [2]=>
          string(2) "12"
          [3]=>
          string(2) "17"
          [4]=>
          string(2) "16"
          [5]=>
          string(2) "15"
          [6]=>
          string(1) "4"
          [7]=>
          string(1) "3"
          [8]=>
          string(2) "18"
          [9]=>
          string(1) "9"
          [10]=>
          string(1) "2"
          [11]=>
          string(2) "20"
          [12]=>
          string(1) "1"
          [13]=>
          string(1) "8"
        }
        ["risk_id"]=>
        array(1) {
          [0]=>
          string(1) "4"
          [1]=>
          string(1) "3"
        }
        ["params"]=>
        object(stdClass)#160 (39) {
          ["disease_cpe_5"]=>
          string(7) "1, 1, 2"
          ["disease_mbr_5"]=>
          string(10) "1234, 1, 1"
          ["disease_mtr_5"]=>
          string(8) "12, 1, 1"
          ["disease_cpe_14"]=>
          string(7) "1, 2, 2"
          ["disease_mbr_14"]=>
          string(7) "2, 2, 2"
          ["disease_mtr_14"]=>
          string(7) "2, 2, 2"
          ["disease_cpe_12"]=>
          string(10) "12, 12, 12"
          ["disease_mbr_12"]=>
          string(10) "12, 12, 12"
          ["disease_mtr_12"]=>
          string(10) "12, 12, 12"
          ["disease_cpe_17"]=>
          string(4) "4, 1"
          ["disease_mbr_17"]=>
          string(4) "1, 1"
          ["disease_mtr_17"]=>
          string(4) "1, 1"
          ["disease_cpe_16"]=>
          string(4) "4, 1"
          ["disease_mbr_16"]=>
          string(5) "21, 5"
          ["disease_mtr_16"]=>
          string(3) "122,6"
          ["disease_cpe_8"]=>
          string(6) "11, 11"
          ["disease_mbr_8"]=>
          string(1) "1, 1"
          ["disease_mtr_8"]=>
          string(1) "1, 1"
          ["disease_cpe_15"]=>
          string(13) "132, 132, 132"
          ["disease_mbr_15"]=>
          string(13) "132, 132, 132"
          ["disease_mtr_15"]=>
          string(7) "1, 1, 1"
          ["disease_cpe_4"]=>
          string(7) "1, 7, 7"
          ["disease_mbr_4"]=>
          string(7) "1, 8, 8"
          ["disease_mtr_4"]=>
          string(7) "9, 9, 9"
          ["disease_cpe_3"]=>
          string(1) "7"
          ["disease_mbr_3"]=>
          string(1) "8"
          ["disease_mtr_3"]=>
          string(1) "9"
          ["disease_cpe_18"]=>
          string(1) "1"
          ["disease_mbr_18"]=>
          string(1) "1"
          ["disease_mtr_18"]=>
          string(1) "1"
          ["disease_cpe_9"]=>
          string(1) "3"
          ["disease_mbr_9"]=>
          string(1) "3"
          ["disease_mtr_9"]=>
          string(1) "3"
          ["disease_cpe_2"]=>
          string(1) "3"
          ["disease_mbr_2"]=>
          string(1) "3"
          ["disease_mtr_2"]=>
          string(1) "3"
          ["disease_cpe_20"]=>
          string(2) "10"
          ["disease_mbr_20"]=>
          string(2) "11"
          ["disease_mtr_20"]=>
          string(2) "12"
          ["disease_cpe_1"]=>
          string(1) "1"
          ["disease_mbr_1"]=>
          string(1) "3"
          ["disease_mtr_1"]=>
          string(1) "3"
          ["risk_cpe_4"]=>
          string(1) "1, 1"
          ["risk_mbr_4"]=>
          string(1) "2, 2"
          ["risk_mtr_4"]=>
          string(1) "3, 3"
          ["risk_cpe_3"]=>
          string(1) "5"
          ["risk_mbr_3"]=>
          string(1) "5"
          ["risk_mtr_3"]=>
          string(1) "5"
        }
      }
    }

我尝试了很多方法,但没有找到有效解决此问题的答案。这是我的尝试之一:

$newArray = array();
        if( !is_object($newArray["parpams"]) ){
            $newArray["parpams"] = new StdClass();
        }
        foreach ($selected as $key => $value){
            foreach ($selected as $key_i => $value_i){
                if (is_array($value["disease_id"]) && is_array($value_i["disease_id"])){
                    $has = (count(array_intersect($value["disease_id"], $value_i["disease_id"]))) ? true : false;
                    if($has){
                        foreach ($value["disease_id"] as $pointer => $disease){
                            if (in_array($disease, $value["disease_id"])){
                                $newArray["disease_id"][] = $selected[$key]["disease_id"][$pointer];
                                unset($selected[$key]["disease_id"][$pointer]);
                                $cpe = "disease_cpe_".$disease;
                                $mbr = "disease_mbr_".$disease;
                                $mtr = "disease_mtr_".$disease;
                                if ($newArray["parpams"]->$cpe){
                                    $newArray["parpams"]->$cpe = $newArray["parpams"]->$cpe.', '. $selected[$key]["params"]->$cpe;
                                } else {
                                    $newArray["parpams"]->$cpe = $selected[$key]["params"]->$cpe;
                                }
                                if ($newArray["parpams"]->$mbr){
                                    $newArray["parpams"]->$mbr = $newArray["parpams"]->$mbr.', '. $selected[$key]["params"]->$mbr;
                                } else {
                                    $newArray["parpams"]->$mbr = $selected[$key]["params"]->$mbr;
                                }
                                if ($newArray["parpams"]->$mtr){
                                    $newArray["parpams"]->$mtr = $newArray["parpams"]->$mtr.', '. $selected[$key]["params"]->$mtr;
                                } else {
                                    $newArray["parpams"]->$mtr = $selected[$key]["params"]->$mtr;
                                }
                                unset($selected[$key]["params"]->$cpe);
                                unset($selected[$key]["params"]->$mbr);
                                unset($selected[$key]["params"]->$mtr);
                            }
                        }
                    }
                }
                if (is_array($value["risk_id"]) && is_array($value_i["risk_id"])){
                    $has = (count(array_intersect($value["risk_id"], $value_i["risk_id"]))) ? true : false;
                    if($has){
                        foreach ($value["risk_id"] as $pointer => $risk){
                            if (in_array($risk, $value["risk_id"])){
                                $newArray["risk_id"][] = $selected[$key]["risk_id"][$pointer];
                                unset($selected[$key]["risk_id"][$pointer]);
                                $cpe = "risk_cpe_".$risk;
                                $mbr = "risk_mbr_".$risk;
                                $mtr = "risk_mtr_".$risk;
                                if ($newArray["parpams"]->$cpe){
                                    $newArray["parpams"]->$cpe = $newArray["parpams"]->$cpe.', '. $selected[$key]["params"]->$cpe;
                                } else {
                                    $newArray["parpams"]->$cpe = $selected[$key]["params"]->$cpe;
                                }
                                if ($newArray["parpams"]->$mbr){
                                    $newArray["parpams"]->$mbr = $newArray["parpams"]->$mbr.', '. $selected[$key]["params"]->$mbr;
                                } else {
                                    $newArray["parpams"]->$mbr = $selected[$key]["params"]->$mbr;
                                }
                                if ($newArray["parpams"]->$mtr){
                                    $newArray["parpams"]->$mtr = $newArray["parpams"]->$mtr.', '. $selected[$key]["params"]->$mtr;
                                } else {
                                    $newArray["parpams"]->$mtr = $selected[$key]["params"]->$mtr;
                                }
                                unset($selected[$key]["params"]->$cpe);
                                unset($selected[$key]["params"]->$mbr);
                                unset($selected[$key]["params"]->$mtr);
                            }
                        }
                    }
                }
            }
        }

这是另一个尝试:

$newArray = array();
            $newArray["disease_id"] = array();
            $newArray["risk_id"] = array();
            if( !is_object($newArray["parpams"]) ){
                $newArray["parpams"] = new StdClass();
            }
            foreach ($selected as $key => $value){
                foreach ($selected as $key_i => $value_i){
                    if (is_array($value["disease_id"]) && is_array($value_i["disease_id"])){
                        $has = (count(array_intersect($value["disease_id"], $value_i["disease_id"]))) ? true : false;
                        if($has){
                            $newArray["disease_id"] =  array_merge($value["disease_id"], $value_i["disease_id"],$newArray["disease_id"]);
                        }
                    }
                    if (is_array($value["risk_id"]) && is_array($value_i["risk_id"])){
                        $has = (count(array_intersect($value["risk_id"], $value_i["risk_id"]))) ? true : false;
                        if($has){
                            $newArray["risk_id"] =  array_merge($value["risk_id"], $value_i["risk_id"],$newArray["risk_id"]);
                        }
                    }
                }
                $newArray["disease_id"] = array_unique($newArray["disease_id"]);
                $newArray["risk_id"] = array_unique($newArray["risk_id"]);
            }
        }

推杆是:

array(3) {
  ["disease_id"]=>
  array(14) {
    [0]=>
    string(1) "5"
    [1]=>
    string(2) "14"
    [2]=>
    string(2) "12"
    [3]=>
    string(1) "8"
    [4]=>
    string(2) "15"
    [5]=>
    string(1) "4"
    [21]=>
    string(2) "17"
    [22]=>
    string(2) "16"
    [39]=>
    string(1) "3"
    [40]=>
    string(2) "18"
    [41]=>
    string(1) "9"
    [42]=>
    string(1) "2"
    [43]=>
    string(2) "20"
    [44]=>
    string(1) "1"
  }
  ["risk_id"]=>
  array(2) {
    [0]=>
    string(1) "4"
    [1]=>
    string(1) "3"
  }
  ["parpams"]=>
  object(stdClass)#236 (0) {
  }
}

但是["参数"]仍然不包括在内。

我已经阅读了许多关于堆栈溢出的踏板,但非现实性解决了这种复杂性。如果我错过了一个线程,请指出我这个方向。请记住,这些数组可以变成多达二十个数组。坦克!

我认为如果它对任何其他人有任何帮助,这就是答案。

$newArray = array();
            $newArray["disease_id"] = array();
            $newArray["risk_id"] = array();
            $newArray["params"] = array();
            foreach ($selected as $key => $value){
                foreach ($selected as $key_i => $value_i){
                    if (is_array($value["disease_id"]) && is_array($value_i["disease_id"])){
                        $newArray["disease_id"] =  array_merge($value["disease_id"], $value_i["disease_id"],$newArray["disease_id"]);
                    }
                    if (is_array($value["risk_id"]) && is_array($value_i["risk_id"])){
                        $newArray["risk_id"] =  array_merge($value["risk_id"], $value_i["risk_id"],$newArray["risk_id"]);
                    }
                }
                if(is_object($value["params"])){
                    $newArray["params"] =  array_merge_recursive((array) $value["params"], (array) $newArray["params"]);
                }
            }
            $newArray_risk = array_unique($newArray["risk_id"]);
            if(sort($newArray_risk)){
                $newArray["risk_id"]= array();
                foreach ($newArray_risk as $risk_id){
                    $newArray["risk_id"][] = $risk_id;
                }
            }
            $newArray_disease = array_unique($newArray["disease_id"]);
            if(sort($newArray_disease)){
                $newArray["disease_id"] = array();
                foreach ($newArray_disease as $disease_id){
                    $newArray["disease_id"][] = $disease_id;
                }
            }
            foreach ($newArray["params"] as $key => $value){
                if (is_array($value)){
                    $i=0;
                    foreach ($value as $val){
                        if (!is_array($val)){
                            if ($i == 0){
                                $newArray["params"][$key] = $val;
                            } else {
                                $newArray["params"][$key] .= ', '.$val;
                            }
                            $i++;
                        }
                    }
                }
            }
            $newArray["params"] = (object)$newArray["params"];
        }