首页 > 解决方案 > 关联数组更改键值

问题描述

我有以下代码来遍历 json 数组并更改数组中的值。

<?php
$json='[{"type":"dropdown","label":"Is the property tenanted ?","req":0,"choices":[{"label":"Yes","sel":0,"notification":0,"subOptions":[{"NoteLabel":"Real Estate Agency ?","NoteValue":"","reqNote":"1"},{"NoteLabel":"Agents Mobile Number:","NoteValue":"","reqNote":"1"},{"NoteLabel":"Agents Email:","NoteValue":"","reqNote":"0"},{"PhotoLabel":"Attach a photo","PhotoValues":"","reqPhoto":"1"},{"NoteLabel":"Tenants Contact Number:","NoteValue":"","reqNote":"0"}]},{"label":"No","sel":1,"notification":0,"subOptions":[{"NoteLabel":"Clients Contact Number:","NoteValue":"","reqNote":"1"},{"PhotoLabel":"Attach a photo","PhotoValues":"","reqPhoto":"1"}]},{"label":"N\/A","sel":0,"notification":0,"subOptions":[]}]}]';
echo $json."<br/>";
echo "<br/><br/><br/>****************<br/><br/><br/>";
$json=json_decode($json,true);
foreach($json as $kSub => $vSub)
{
    if( in_array($vSub['type'], ["dropdown"]))
    {
         if($vSub['label']=="Is the property tenanted ?")
         {
               $choices=&$vSub['choices'];
               foreach($choices as $keyChoice=>&$valChoice)
               {
                   if($valChoice['label']=="Yes")
                   {
                       $subOptions=&$valChoice['subOptions'];
                       foreach($subOptions as $kop=>&$Opval)
                       {
                           foreach($Opval as $kn=>&$vn)
                           {
                               if($kn=="NoteLabel")
                               {

                                    if($vn=="Real Estate Agency ?")
                                    { 

                                        $subOptions[$kop]['NoteValue']="DOMAIN";
                                    }
                               }
                           }
                       }
                   }
               }
         }
    }
}

echo json_encode($json)."<br/>";

如果满足条件,我想更改NoteValue内部数组。subOptions我不确定我是否做对了,但价值没有改变。请帮我解决我做错了什么!我还想知道是否可以减少代码行数以获得结果?

标签: phparraysjson

解决方案


您需要使用&vSub它来使其成为参考变量。

您可以通过摆脱最后一个循环来缩短代码,NoteLabel直接访问索引。您还可以将前两个测试与&&. foreach而且您的循环中不需要任何索引变量。

foreach($json as &$vSub)
{
    if($vSub['type'] == "dropdown" && $vSub['label']=="Is the property tenanted ?")
    {
        $choices=&$vSub['choices'];
        foreach($choices as &$valChoice)
        {
            if($valChoice['label']=="Yes")
            {
                $subOptions=&$valChoice['subOptions'];
                foreach($subOptions as &$Opval)
                {
                    if (isset($Opval['NoteLabel']) && $Opval['NoteLabel'] == "Real Estate Agency ?") 
                    {
                        $Opval['NoteValue']="DOMAIN";
                    }
                }
            }
        }
    }
}

推荐阅读