将JSON对象1中的Key:Value与JSON对象2中的Key:Value进行比较,如果条件匹配,则更改Value


Compare Key : Value in JSON object 1 to Key : Value in JSON object 2 and if condition matches, alter the Value

我有两个JSON对象,一个用于雄性遗传学,另一个用于雌性遗传学。如下所示:

男:

$male='{ 
    "Bell-Albino":"Bb",
    "Rainwater-Albino":"null",
    "Tremper-Albino":"null",
    "Murphys-Patternless":"null",
    "Eclipse":"Ee",
    "Marble-Eye":"null",
    "Blizzard":"Zz",
    "Mack-Snow":"Mm",
    "Super-Snow":"null",
    "Gem-Snow":"null",
    "TUG-Snow":"null",
    "Line-Bred-Snow":"null",
    "Enigma":"null",
    "White-and-Yellow":"null",
    "Wildtype":"null",
    "Giant":"null" 
}'; 

女性:

$female='{ 
    "Bell-Albino":"BB",
    "Rainwater-Albino":"null",
    "Tremper-Albino":"null",
    "Murphys-Patternless":"null",
    "Eclipse":"null",
    "Marble-Eye":"null",
    "Blizzard":"zz",
    "Mack-Snow":"mm",
    "Super-Snow":"null",
    "Gem-Snow":"null",
    "TUG-Snow":"null",
    "Line-Bred-Snow":"null",
    "Enigma":"null",
    "White-and-Yellow":"null",
    "Wildtype":"null",
    "Giant":"null" 
}';

如果我们从Male对象中取Eclipse key,我们就得到了"Eclipse":"Ee",如果我们对Female对象也这样做,我们就有了"Eclipse":"null"

在遗传学中,EE表示显性,Ee表示隐性,ee表示无效,但可用于基因计算。

我需要做的是检查两个对象的keys,如果一个对象的值为而不是"null"(这意味着它可能是EE or Ee)的key(例如Eclipse),则需要检查另一个对象,并用小写字母(如ee)替换另一个物体中的null值。

我知道数组相交(当使用数组时),但我甚至不确定这是否是正确的使用方法?

这对我来说很难解释,也很难编码,所以很抱歉我说了一点。如果我需要澄清什么,请这样说。

//convert to arrays
$male = json_decode($male, true);
$female = json_decode($female, true);
foreach( $male as $key => $value ) {
  if ( $value != 'null' && $female[$key] == 'null' ) {
      $female[$key] = strtolower($value);
  } else {
    if ($female[$key] != 'null' && $value == 'null')
      $male[$key] = strtolower($female[$key]);
  }
}

另一个选项。如果一个值是'null',你可以用另一个性别的小写值覆盖它,而不检查它是什么。如果另一个值也是'null',什么都不会改变,如果不是,你会得到它的小写版本。

$genders = array_map('json_decode', [$male, $female]);
foreach ($genders as $gender => $values) {
    foreach ($values as $key => $value) {
        // overwrite all nulls with lowercase corresponding value of other gender
        if ($value == 'null') $genders[$gender]->$key = strtolower($genders[!$gender]->$key);
    }
}
list($male, $female) = $genders;
$male = json_decode($male);
$female = json_decode($female);
foreach($male as $key => $value){
    if(array_key_exists($key, $female)){
        if($value === "null"){
            $male->{$key} = $female->{$key};
        }
    }
}
foreach($female as $key => $value){
    if(array_key_exists($key, $male)){
        if($value === "null"){
            $female->{$key} = $male->{$key};
        }
    }
}
print_r($male);
print_r($female);
// convert back to json if you need to?
$male = json_encode($male);
$female = json_encode($female);

让我知道这是否符合要求:

for(i in $male){
  if ($male[i] != 'null' && $female[i] == 'null'){
    $female[i] = 'ee';
  }
}
for(i in $female){
  if ($female[i] != 'null' && $male[i] == 'null'){
    $male[i] = 'ee';
  }
}

你可以在这里测试:

https://jsfiddle.net/tz746xdz/1/

和一个PHP版本:

$maleDecode = json_decode($male);
$femaleDecode = json_decode($female);
foreach ($maleDecode as $key=>$val){
  if ($maleDecode->$key != 'null' and $femaleDecode->$key == 'null')
    $femaleDecode->$key = 'ee';
}
foreach ($femaleDecode as $key=>$val){
  if ($femaleDecode->$key != 'null' and $maleDecode->$key == 'null')
    $maleDecode->$key = 'ee';
}