2016-11-22 7 views
0

ネストされた配列では、キーxをyで変更したいと思います。たとえば:PHPでネストされた配列のキーを更新するには?

clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount 

になる必要があります。

clonedAssetSource - 2000:clonedAssetSource - 2000._jvxMatchCount. 

私は再帰的な解決策を書いたが、それは働いていません。ここで私は、ネストされた配列にデコードJSONは次のとおりです。

function updateConditions(&$conditions, $oldDataServiceName, $newDataServiceName) { 
    foreach($conditions as $condIndex => $condition){ 
     foreach($condition['selectors'] as $selIndex => $sel) 
      foreach($sel as $ruleIndex => $condValue){ 
       if($ruleIndex != 'id' && $ruleIndex !='comparator') { 
        $compareKey = $oldDataServiceName.":".$oldDataServiceName."._jvxMatchCount"; 
        if($ruleIndex == $compareKey) { 
         unset($conditions[$condIndex]['selectors'][$selIndex][$ruleIndex]); 
         $newKey = $newDataServiceName.":".$newDataServiceName."._jvxMatchCount"; 
         $conditions[$condIndex]['selectors'][$selIndex][$newKey] = $condValue; 
        } 
       } 
      } 
     } 
     if(isset($condition['conditions'])){ 
      updateConditions($condition['conditions'], $oldDataServiceName, $newDataServiceName); 
     } 
    } 
    return true; 
} 

と、次のように私は、配列$ rulePackageArrそれを渡す上記の関数を呼び出し:

{ 
    "defaultAssetGroup":"def", 
    "data":[ 
     { 
      "id":"R-136-11821-1479722207355", 
      "ruleName":"Rule 1", 
      "reportConfig":{ 
       "includeAssetSources":[ 
        "773" 
       ] 
      }, 
      "creative_groups":[ 
       "base1" 
      ], 
      "conditions":[ 
       { 
        "id":"R-136-11821-1479722207355", 
        "operator":"and", 
        "selectors":[ 
         { 
          "id":"TRI-R-136-11821-1479722220855", 
          "comparator":"equals", 
          "device:device.model":"iPhone" 
         }, 
         { 
          "id":"TRI-R-136-11821-1479741956751", 
          "comparator":"equals", 
          "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"20" 
         }, 
         { 
          "id":"TRI-R-136-11821-1479742095900", 
          "comparator":"greater-than", 
          "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"20" 
         }, 
         { 
          "id":"TRI-R-136-11821-1479742096434", 
          "comparator":"less-than", 
          "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"20" 
         } 
        ], 
        "conditions":[ 
         { 
          "id":"R-136-11821-1479744209533", 
          "operator":"and", 
          "selectors":[ 
           { 
            "id":"TRI-R-136-11821-1479744228986", 
            "comparator":"equals", 
            "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"10" 
           }, 
           { 
            "id":"TRI-R-136-11821-1479744230911", 
            "comparator":"greater-than", 
            "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"10" 
           }, 
           { 
            "id":"TRI-R-136-11821-1479744232111", 
            "comparator":"less-than", 
            "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"10" 
           } 
          ], 
          "conditions":[ 
           { 
            "id":"R-136-11821-1479744233099", 
            "operator":"and", 
            "selectors":[ 
             { 
              "id":"TRI-R-136-11821-1479744234649", 
              "comparator":"equals", 
              "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"12" 
             }, 
             { 
              "id":"TRI-R-136-11821-1479744235059", 
              "comparator":"greater-than", 
              "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"12" 
             }, 
             { 
              "id":"TRI-R-136-11821-1479744237266", 
              "comparator":"less-than", 
              "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"12" 
             } 
            ], 
            "conditions":[ 

            ] 
           } 
          ] 
         } 
        ] 
       } 
      ] 
     }, 
     { 
      "id":"R-136-11821-1479744343408", 
      "ruleName":"Rule 2", 
      "reportConfig":{ 
       "includeAssetSources":[ 
        "773" 
       ] 
      }, 
      "creative_groups":[ 

      ], 
      "conditions":[ 
       { 
        "id":"R-136-11821-1479744343408", 
        "operator":"and", 
        "selectors":[ 
         { 
          "id":"TRI-R-136-11821-1479744356803", 
          "comparator":"equals", 
          "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"8" 
         }, 
         { 
          "id":"TRI-R-136-11821-1479744357331", 
          "comparator":"greater-than", 
          "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"8" 
         }, 
         { 
          "id":"TRI-R-136-11821-1479744360713", 
          "comparator":"less-than", 
          "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"8" 
         } 
        ], 
        "conditions":[ 
         { 
          "id":"R-136-11821-1479744362635", 
          "operator":"and", 
          "selectors":[ 
           { 
            "id":"TRI-R-136-11821-1479744363763", 
            "comparator":"equals", 
            "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"9" 
           }, 
           { 
            "id":"TRI-R-136-11821-1479744363991", 
            "comparator":"equals", 
            "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"9" 
           }, 
           { 
            "id":"TRI-R-136-11821-1479744365361", 
            "comparator":"equals", 
            "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"9" 
           } 
          ], 
          "conditions":[ 
           { 
            "id":"R-136-11821-1479744366147", 
            "operator":"and", 
            "selectors":[ 
             { 
              "id":"TRI-R-136-11821-1479744367734", 
              "comparator":"equals", 
              "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"3" 
             }, 
             { 
              "id":"TRI-R-136-11821-1479744367950", 
              "comparator":"greater-than", 
              "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"3" 
             }, 
             { 
              "id":"TRI-R-136-11821-1479744368203", 
              "comparator":"less-than", 
              "clonedAssetSource - 1479722826:clonedAssetSource - 1479722826._jvxMatchCount":"3" 
             } 
            ], 
            "conditions":[ 

            ] 
           } 
          ] 
         } 
        ] 
       } 
      ] 
     } 
    ], 
    "assetSources":[ 
     { 
      "dataSignal":"tagVarService", 
      "property":"DataSignal1", 
      "assetDatabase":"773", 
      "addToCreativeId":true 
     } 
    ], 
    "reportingKeyFormat":"ruleDefined", 
    "virtualAssets":[ 
     { 
      "assetId":"customAsset.asset103", 
      "assetDatabase":"773", 
      "keyColumn":"Image", 
      "assetProperty":"icon" 
     } 
    ] 
} 

これは私のコードスニペットです

if(!empty($newDataServiceNames)) { 
    foreach ($newDataServiceNames as $oldDataServiceName => $newDataServiceName) { 
     if(!empty($rulePackageArr['data'])){ 
      foreach($rulePackageArr['data'] as $key => $data){ 
       updateConditions($rulePackageArr['data'][$key]['conditions'], $oldDataServiceName, $newDataServiceName); 
      } 
     } 
    } 
} 
+0

正規表現を使用しないのはなぜ? – Eric

+0

2番目の 'foreach'には省略カッコがあります。 – trincot

+0

NB: 'json'タグを削除しました。配列がJSONからデコードされたという事実は、ここで実際には関係ありません。 – trincot

答えて

1

主な問題は、再帰呼び出しが元の配列への参照ではなくコピーであることです。あなたは&接辞で、$condition変数に参照することによって、この問題を解決することができます

foreach($conditions as $condIndex => &$condition){ 
関連する問題