PHP - 基于多维数组的占位符查找和替换

时间:2017-11-17 18:22:04

标签: php arrays json multidimensional-array preg-replace

我有一个多维数组,我需要能够用相关值替换JSON占位符。 此外,我还需要能够级联值。

我可能只是错过了一件简单的事情,但它现在已经困扰了我好几天。 如果有人可以为我指出一个问题,我会非常感激。

例如,这是我的数据数组:

$SCREEN = array(
    'z5OrfqifU8RiA' =>
    array(
        'current_status' => 'Completed',
        'email' => 'luke@test.com',
        'Messages' =>
        array(
            array(
                array(
                    'type' => 'message',
                    'messageIndex' => 0,
                    'ReceivedAt' => '17/11/2017 17:06:23',
                    'Name' => 'Luke ',
                    'Message' => 'Hello.'
                ),
                array(
                    'type' => 'message',
                    'messageIndex' => 1,
                    'ReceivedAt' => '17/11/2017 17:06:25',
                    'Name' => 'Luke2 ',
                    'Message' => 'Hello back.'
                )
            )
        ),
        'Message Count' => 2,
    )
);

我需要将表示数组值的占位符作为点表示法,并使用通配符将它们替换为正确的字符串OR子数组。

以下是一些前后的例子......

来自:

{ "Messages": "{{SCREEN.Messages}}"}

{
    "Messages": [
        {
          "type": "message",
          "messageIndex": 0,
          "ReceivedAt": "17/11/2017 17:06:23",
          "Name": "Luke",
          "Message": "Hello."
        },{
          "type": "message",
          "messageIndex": 1,
          "ReceivedAt": "17/11/2017 17:07:06",
          "Name": "Luke2",
          "Message": "Hello back."
        }
      ]
}

来自:

{ "email": "{{SCREEN.email}}"}

{ "email": "luke@test.com"}

来自:

{ "everything": "{{SCREEN.*}}"}

{
  "everything": {
    "z5OrfqifU8RiA": {
      "current_status": "Completed",
      "email": "luke@test.com",
      "Messages": [
        [
          {
            "type": "message",
            "messageIndex": 0,
            "ReceivedAt": "17/11/2017 17:06:23",
            "Name": "Luke",
            "Message": "Hello."
          },
          {
            "type": "message",
            "messageIndex": 1,
            "ReceivedAt": "17/11/2017 17:07:06",
            "Name": "Luke2",
            "Message": "Hello back."
          }
        ]
      ],
      "Message Count": 2
    }
  }
}

这是当前代码,如果您显式地定位值,但不是使用通配符来获取该键的子节点的数组。

$SCREEN = array(
    'z5OrfqifU8RiA' =>
    array(
        'current_status' => 'Completed',
        'email' => 'luke@test.com',
        'Messages' =>
        array(
            array(
                array(
                    'type' => 'message',
                    'messageIndex' => 0,
                    'ReceivedAt' => '17/11/2017 17:06:23',
                    'Name' => 'Luke ',
                    'Message' => 'Hello.'
                ),
                array(
                    'type' => 'message',
                    'messageIndex' => 1,
                    'ReceivedAt' => '17/11/2017 17:06:25',
                    'Name' => 'Luke2 ',
                    'Message' => 'Hello back.'
                )
            )
        ),
        'Message Count' => 2,
    )
);



$X = parseVariables('{ "everything": "{{SCREEN.*}}"}');


$Y = parseVariables('{ "email": "{{SCREEN.email}}"}');


function parseVariables($array) {
    GLOBAL $SCREEN;

    foreach(flatten($SCREEN) AS $K => $V)$array = MD_ArrayFandR("{{SCREEN.".$K."}}",$V,$array);

    return $array;
}



function flatten($array) {
    $result = array();
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $result = $result + flatten($value, $key . '.');
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}


function MD_ArrayFandR($Find, $Replace,$Array){
    if (is_array($Array)){
        $ex=json_encode($Array);
        return json_decode(str_replace($Find, $Replace,$ex),true);
    } else {
        return str_replace($Find, $Replace,$Array);
    }
}


print_r($X);

print_r($Y);

1 个答案:

答案 0 :(得分:0)

编写一个可以下降到结构中的递归函数,如:

function recurse($foo) {
    foreach( $foo as $key => $value ) {
        if( is_array($value) ) {
            $foo[$key] = recurse($value);
        } else if( /* $value is a placeholder */ ) {
            $foo[$key] = /* replacement */;
        }
    }
    return $foo
}